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



根据文档:

allow_mutation

是否模型是人工不可变的,即setattr

我有一个类:

class MyModel(BaseModel):
field1:int
class Config:
allow_mutation = True

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

model1 = MyModel(field1=1)
model1.field2 = 2

我得到这个错误:

File "pydantic/main.py", line 347, in pydantic.main.BaseModel.__setattr__
ValueError: "MyModel" object has no field "field2"

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

setattr(model1, 'field2', 2)

输出:

File "pydantic/main.py", line 347, in pydantic.main.BaseModel.__setattr__
ValueError: "MyModel" object has no field "field2"

我错过了什么?

您可以在类中使用Config对象并将extra属性设置为"allow"或者在声明模型时使用它作为extra=Extra.allowkwargs

文档中的例子:

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

extra.allow举例回答问题

from pydantic import BaseModel, ValidationError, Extra

class Model(BaseModel, extra=Extra.allow):
a: str
my_model = Model(a="1")
my_model.b = "2"
# Model(a='1', b='2')