我使用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
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