Как сделать пиддантику различать вложенный объект на основе области?Python

Программы на Python
Ответить
Anonymous
 Как сделать пиддантику различать вложенный объект на основе области?

Сообщение Anonymous »

У меня есть эта модель Pydantic: < /p>

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

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
Однако, если type равен «A», а data содержит TypeBData, проверка будет проведена правильно, хотя это не должно происходить. Это может быть альтернативой:

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

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')
Это работает; однако есть ли лучший способ сделать это, не повторяя клавиши перечисления (, 'B' и 'C') и значения (

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

TypeAData
, TypeBData и TypeCData) дважды?
Я пробовал использовать распознаваемые объединения, но поскольку поле type и распознаваемое поля находятся на разных уровнях модели (последняя находится внутри вложенного объекта), я не смог добиться дальнейшего прогресса в этом вопросе.

Подробнее здесь: https://stackoverflow.com/questions/771 ... on-a-field
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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