Настройка полей для вложенных и унаследованных моделей в Pydantic

#python #validation #python-typing #pydantic #python-dataclasses

Вопрос:

Я тщательно искал ответ на этот вопрос, но безрезультатно.

При использовании pydantic ge=0 проверка item_main в следующем примере проходит без сучка и задоринки, как и следовало ожидать (в соответствии с инструкциями: https://pydantic-docs.helpmanual.io/usage/schema/#field-customisation):

 class SubCls(BaseModel):
    item_sub: float = Field(...)

class MainCls(BaseModel):
    item_main1: float = Field(...)
    item_main2: SubCls

    class Config:
        fields = {'item_main1': {'ge': 0}}
 

Однако ge=0 проверка вложенности item_sub в следующем примере не работает:

 class SubCls(BaseModel):
    item_sub: float = Field(...)

class MainCls(BaseModel):
    item_main1: float = Field(...)
    item_main2: SubCls

    class Config:
        fields = {'item_main2': {"item_sub":{'ge': 0}}}
 

Также не происходит, когда он SubCl наследуется MainCls :

 class SubCls(BaseModel):
    item_sub: float = Field(...)

class MainCls(SubCls):
    item_main1: float = Field(...)

    class Config:
        fields = {"item_sub":{'ge': 0}}
 

Мне интересно, как я могу наилучшим образом применить настройку полей к вложенным моделям. Конечно, самый элегантный способ сделать это-создать новые SubCls модели с добавлением информации о проверке, но в моем случае это привело бы к довольно большому количеству моделей.
Я был бы благодарен за любую помощь.

Этот запрос был перекрестно размещен на форуме github pydantic: https://github.com/samuelcolvin/pydantic/discussions/3400.

Комментарии:

1. Я думаю, что если у вас разные правила проверки для того, что кажется одной моделью, на самом деле у вас разные модели. Сколько моделей вам нужно было бы создать? Почему их слишком много?

2. Я хотел бы использовать одни и те же схемы для многих различных функций, но многие из этих функций имеют разные Field аргументы параметров (например, разные ge , gt , le lt , title и description ). Конечно, я мог бы также проверить входные данные в функциях, но это несколько противоречит цели проверки pydantic. Я надеялся использовать общие модели/схемы, но с различными class Config вариантами, чтобы разнообразить проверки моделей. Это сэкономило бы много времени на дублировании.

3. @Svencken вопрос неясен, но похоже, что для этого вам может понадобиться метакласс

4. @rv.kvetch, спасибо, я займусь этим. Приносим извинения, если вопрос неясен, с удовольствием отвечу на любые вопросы по этому поводу, чтобы помочь прояснить ситуацию.