Pydantic – изменение данных во вложенной модели перед проверкойPython

Программы на Python
Anonymous
Pydantic – изменение данных во вложенной модели перед проверкой

Сообщение Anonymous »

У меня есть небольшой пример вложенного объекта с pydantic.

Код: Выделить всё

from typing import Dict
from pydantic import BaseModel, Field, ValidationError

class UserType(BaseModel):
name: str = Field(min_length=1)
type: str = Field(min_length=1)

class AppConfig(BaseModel):
key1: int = Field(gt=0)
objects: Dict[str, UserType]

try:
data = {
"key1": 1,
"objects": {
"type1": {
"name": "Name 2",
},
"type2": {
"name": "Name 1"
}
}
}
c = AppConfig(**data)
print(c.model_dump_json())
except ValidationError as e:
print(e)

Очевидно, это не удалось, поскольку тип не установлен в модели UserType. Моя цель состоит в том, чтобы каким-то образом установить каждый UserType.type, используя связанный ключ из словаря объектов, перед фактической проверкой. Что-то вроде:
  • Я передаю данные в модель
  • Модель проверяет основные ключи
    < li>Перед проверкой вложенных объектов он копирует ключ dict как ключ type = внутри данных, которые затем передаются в модель UserType
Возможно ли это каким-то образом с помощью pydantic?
Я знаю, что могу сделать все это перед передачей данных в основную модель, но я хочу знать, возможно ли это в модели pydantic.< /p>
Я также пробовал использовать метод model_post_init() следующим образом:

Код: Выделить всё

from typing import Dict
from pydantic import BaseModel, Field, ValidationError

class UserType(BaseModel):
name: str = Field(min_length=1)
type: str = Field(min_length=1)

class AppConfig(BaseModel):
key1: int = Field(gt=0)
objects: Dict[str, UserType]

def model_post_init(self, __context) -> None:
values = self.dict()
for obj_type, obj in values["objects"].items():
print(obj, obj_type)
obj["type"] = obj_type

try:
data = {
"key1": 1,
"objects": {
"type1": {
"name": "Name 2",
#"type": "t"
},
"type2": {
"name": "Name 1",
#"type": "t"
}
}
}
c = AppConfig(**data)
print(c.model_dump_json())
except ValidationError as e:
print(e)

Но этот метод выполняется после проверки, а проверка не удалась ранее. Также пытался установить некоторые фиктивные значения типа в полезных данных, а затем переопределить их в model_post_init(), но это вообще не сработало, и модель имела только исходные фиктивные значения для типа.


Подробнее здесь: https://stackoverflow.com/questions/783 ... validation

Вернуться в «Python»