#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)