Pydantic 设置属性/字段以动态建模

jos*_*faz 11 python pydantic

根据文档

允许突变

模型是否是假不可变的,即是否允许setattr (默认值:True)

好吧,我有一堂课:

class MyModel(BaseModel):

    field1:int

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

如果我尝试动态添加字段:

model1 = MyModel(field1=1)
model1.field2 = 2
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

  File "pydantic/main.py", line 347, in pydantic.main.BaseModel.__setattr__
ValueError: "MyModel" object has no field "field2"
Run Code Online (Sandbox Code Playgroud)

显然,使用setattr方法会导致同样的错误。

  File "pydantic/main.py", line 347, in pydantic.main.BaseModel.__setattr__
ValueError: "MyModel" object has no field "field2"
Run Code Online (Sandbox Code Playgroud)

输出:

setattr(model1, 'field2', 2)
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

小智 8

您可以在类中使用 Config 对象并将属性设置extra为“允许”或extra=Extra.allow在声明模型时将其用作 kwargs

文档中的示例:

from pydantic import BaseModel, ValidationError, Extra


class Model(BaseModel, extra=Extra.forbid):
    a: str


try:
    Model(a='spam', b='oh no')
except ValidationError as e:
    print(e)
    """
    1 validation error for Model
    b
      extra fields not permitted (type=value_error.extra)
    """
Run Code Online (Sandbox Code Playgroud)

  • 我觉得有点奇怪的是,答案中展示了与解决方案相反的内容。仅供记录,您需要使用“class Model(BaseModel, extra=Extra.allow):”,然后构造函数的关键字参数将被实例化为属性。 (9认同)