Как передать конфигурацию pydantic create_model и базовые аргументы

#python #fastapi #pydantic

Вопрос:

Похоже, что pydantic не позволяет передавать как базовые, так и конфигурационные аргументы функции create_model, чтобы избежать путаницы.

То, что я пытался сделать, это:

 from pydantic import BaseModel, create_model

class Config:
    orm_mode = True

E = create_model('E', name='name', __base__=BaseModel)

B = create_model('B', age=1, __base__=E, __config__=Config)

 

С помощью классов это очень просто:

 class E(BaseModel):
    name = 'name'

class B(E):
    age = 18

    class Config:
        orm_mode = True
 

Есть ли способ сделать это с помощью create_model?

Ответ №1:

Я взглянул на тесты Pydantic — test_create_model.py и нашел простой тест, который демонстрирует, как использовать конфигурацию и базу вместе:

 def test_config_and_base():
    with pytest.raises(errors.ConfigError):
        create_model('FooModel', __config__=BaseModel.Config, __base__=BaseModel)
 

Существуют также другие тесты, которые демонстрируют, как использовать класс Config вместе с create_model()

 def test_custom_config():
    class Config:
        fields = {'foo': 'api-foo-field'}

    model = create_model('FooModel', foo=(int, ...), __config__=Config)
    assert model(**{'api-foo-field': '987'}).foo == 987
    assert issubclass(model.__config__, BaseModel.Config)
    with pytest.raises(ValidationError):
        model(foo=654)


def test_custom_config_inherits():
    class Config(BaseModel.Config):
        fields = {'foo': 'api-foo-field'}

    model = create_model('FooModel', foo=(int, ...), __config__=Config)
    assert model(**{'api-foo-field': '987'}).foo == 987
    assert issubclass(model.__config__, BaseModel.Config)
    with pytest.raises(ValidationError):
        model(foo=654)


def test_custom_config_extras():
    class Config(BaseModel.Config):
        extra = Extra.forbid

    model = create_model('FooModel', foo=(int, ...), __config__=Config)
    assert model(foo=654)
    with pytest.raises(ValidationError):
        model(bar=654)