Код: Выделить всё
class SomeModel(BaseModel):
name: str
class SomeOtherModel(BaseModel):
name: int
class MyModel(BaseModel):
items: List[Union[SomeModel, SomeOtherModel]]
@validator("items", always=True)
def validate(cls, value):
by_type = list(filter(lambda v: isinstance(v, SomeModel), value))
if len(by_type) < 1:
raise ValueError("we need at least one SomeModel")
В другом месте моего кода я имею в виду эту модель (контекст: для целей сохранения пользовательских настроек не имеет значения для этого вопроса).
Код: Выделить всё
class ComposerModels(BaseModel):
user: List[MyModel] = []
system: List[MyModel] = []
class ComposerSettings(BaseModel):
models: ComposerModels
class UserSettings(BaseModel):
composer: ComposerSettings
Код: Выделить всё
my_model = MyModel(items=[SomeModel(name="a"), SomeOtherModel(name=1)])
user_settings = UserSettings(
composer=ComposerSettings(
models=ComposerModels(
user=[my_model]
)
)
)
Код: Выделить всё
Traceback (most recent call last):
File ".../pydantic/shenanigans.py", line 38, in
user=[my_model]
File "pydantic/main.py", line 342, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for ComposerModels
user -> 0
we need at least one SomeModel (type=value_error)
По какой-то причине при попытке создать экземпляр UserSettings происходит проверка элементов внутри MyModel, но вместо того, чтобы передать список подмоделей, как ожидалось, каким-то образом вместо этого он получает список экземпляров MyModel. Очевидно, что это не проходит проверку и вызывает ошибку, указанную выше. Однако, если я закомментирую код проверки, он сработает. Ошибки нет, и модель пользовательских настроек содержит ожидаемую MyModel.
Я не могу просто отключить эту проверку, она нужна мне в другом месте моей программы... Есть идеи, что здесь происходит? Я в тупике...
Я использую Python 3.7 с pydantic 1.10 на Centos 7. Я не могу легко обновить какие-либо версии, потому что моя компания не верит в DevOps. так что, если это известная ошибка в pydantic в этой версии, мне придется подумать о чем-то другом.
Подробнее здесь: https://stackoverflow.com/questions/784 ... validation