Код: Выделить всё
import typing
import pydantic
class TypeAData(pydantic.BaseModel):
aStr: str
class TypeBData(pydantic.BaseModel):
bNumber: int
class TypeCData(pydantic.BaseModel):
cBoolean: bool
class MyData(pydantic.BaseModel):
type: typing.Literal['A', 'B', 'C']
name: str
data: TypeAData | TypeBData | TypeCData
Код: Выделить всё
class MyData(pydantic.BaseModel):
type: typing.Literal['A', 'B', 'C']
name: str
data: TypeAData | TypeBData | TypeCData
@pydantic.validator('data', pre=True, always=True)
def validate_data(cls, data):
if isinstance(data, dict):
data_type = data.get('type')
if data_type == 'A':
return TypeAData(**data)
elif data_type == 'B':
return TypeBData(**data)
elif data_type == 'C':
return TypeCData(**data)
raise ValueError('Invalid data or type')
Код: Выделить всё
'A'Код: Выделить всё
TypeADataЯ пробовал использовать распознаваемые объединения, но поскольку поле type и распознаваемое поля находятся на разных уровнях модели (последняя находится внутри вложенного объекта), я не смог добиться дальнейшего прогресса в этом вопросе.
Подробнее здесь: https://stackoverflow.com/questions/771 ... on-a-field
Мобильная версия