如何验证 pydantic 中的复杂列表类型?

one*_*or0 2 python validation pydantic

为什么 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'}]}
Run Code Online (Sandbox Code Playgroud)

验证工作:

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)
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 5

使用 时pydantic,应记住

pydantic主要是一个解析库,而不是验证库。验证是达到目的的一种手段:构建符合所提供的类型和约束的模型。

换句话说,pydantic 保证输出模型的类型和约束,而不是输入数据

为了对传入数据进行额外验证,提供了一个工具 -验证器。例如:

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
Run Code Online (Sandbox Code Playgroud)