为什么 pydantic 不验证 Foo 对象列表的参数,但当参数是基本类型列表时抛出 ValidationError ?
我可以强制执行复杂类型的验证吗?
验证不起作用:
from typing import List
from pydantic import BaseModel
class Foo(BaseModel):
kind: str = "foo"
class Bar(BaseModel):
kind: str = "bar"
class Spam(BaseModel):
foos: List[Foo]
spam = Spam(foos=[Bar()])
print(spam.dict())
>>> {'foos': [{'kind': 'bar'}]}
验证工作:
class Spam(BaseModel):
foos: List[int]
spam = Spam(foos=[Bar()])
print(spam.dict())
pydantic.error_wrappers.ValidationError: 1 validation error for Spam
foos -> 0
value is not a valid integer (type=type_error.integer)
当与pydantic
,应该记住that https://pydantic-docs.helpmanual.io/usage/models/:
pydantic主要是一个解析库,不是验证库。验证是达到目的的一种手段:构建符合所提供的类型和约束的模型。
换句话说,pydantic 保证输出模型的类型和约束,而不是输入数据.
为了对传入数据进行额外验证,提供了一个工具 -验证者 https://pydantic-docs.helpmanual.io/usage/validators/。
例如:
class Spam(BaseModel):
foos: List[Foo]
@validator('foos', pre=True, each_item=True)
def check_squares(cls, v):
assert isinstance(v, Foo), "Foo is only allowed"
return v
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)