在使用pydantic覆盖时验证类属性



我使用Pydantic来验证我的类数据。在某些情况下,在实例化类之后,我想覆盖字段的值,但我想验证新值与Model中定义的类型相同。我希望我应该能够使用验证器,但我还没有看到在对象创建后保护字段的选项。

pydantic中是否有一个简单的机制允许这种类型的验证?

from pydantic import BaseModel, validator
class MyModel(BaseModel):
some_field : str = None

@validator("some_field")
def verify_string(cls, v):
print(f"Verifying some_field value: {v}")
if not isinstance(v, str):
raise ValueError(f"some_field must be str; got type {type(v)}")
return v
# Instantiate model
m = MyModel(some_field = "test")
## prints: Verifying some_field value: test
print(m.some_field)
## prints: test

# Overwrite a field within invalid type
m.some_field = 100 # <-- this should raise value error
print(m.some_field)
## prints: 100

对不起,我找到了解决方案-使用Config和一些validator参数。

class MyModel(BaseModel):
some_field : str = None
class Config:
validate_assignment = True   


@validator(
"some_field", always=True, pre=True,
)
def verify_string(cls, v):
print(f"Verifying some_field value: {v}")
if not isinstance(v, str):
raise ValueError(f"some_field must be str; got type {type(v)}")
return v

最新更新