如何传递 pydantic create_model 配置和基本参数

era*_*zer 8 python pydantic fastapi

似乎 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)

Run Code Online (Sandbox Code Playgroud)

使用类这非常简单:

class E(BaseModel):
    name = 'name'

class B(E):
    age = 18

    class Config:
        orm_mode = True
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 create_model 来做到这一点?

dwi*_*ich 2

我查看了Pydantic 测试 - test_create_model.py 并发现了一个简单的测试,演示了如何一起使用 Config 和 Base:

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

还有其他测试演示如何将 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)
Run Code Online (Sandbox Code Playgroud)