当列表项在pydantic模型中发生更改时,如何验证它们



我在一个pydantic模型中有一个List。我希望我的自定义验证器在列表更改时运行(不仅仅是在分配时(。

from typing import List
from pydantic import BaseModel, validator
class A(BaseModel):
b: List[int] = []
class Config:
validate_assignment = True
@validator("b")
def positive(cls, v):
assert all(i > 0 for i in v), f"No negative numbers: {v}"
return v
a = A()
a.b = [1, 2, -3]  # error
a.b = [1, 2]  # no error
a.b.append(-3)  # no error

我希望最后一个append引发一个错误。

如果我试图重新创建对象(如预期(,我会得到一个错误

A(**a.dict())

甚至允许附加错误的类型。为什么这不打破模式?

a.b.append("asdf")  # no error

这类似于/扩展到:如何在编辑后验证pydantic对象

from pydantic import BaseModel, validator
from typing import List

class PositiveIntList(BaseModel):
__root__: List[int] = []
def append(self, value: int) -> None:
self.__root__.append(value)
super().__init__(__root__=self.__root__)
def __getitem__(self, item: int) -> int:
return self.__root__[item]
def __setitem__(self, item: int, value: int) -> None:
self.__root__[item] = value
super().__init__(__root__=self.__root__)
@validator("__root__", each_item=True)
def positive(cls, v):
assert v > 0, f"No negative numbers: {v}"
return v

class A(BaseModel):
b: PositiveIntList = PositiveIntList()

a = A(b=[1, 2, 3])
a = A(b=[1, 2, -3])  # error
a.b = PositiveIntList.parse_obj([4, 5])
a.b = PositiveIntList.parse_obj([4, -5])  # error
a.b.append(6)
a.b.append(-6)  # error
a.b[0] = 7
a.b[0] = -7  # error

我建议两种评估列表的方法,一种是在列表更改时使用验证器运行,另一种是使用如下字段选项:

from typing import List
from pydantic import BaseModel, validator, Field
class A(BaseModel):
b: List[int] = []
class Config:
validate_assignment = True
@validator("b")
def positive(cls, v):
assert all(i > 0 for i in v), f"No negative numbers: {v}"
return v
class A(BaseModel):
b: List[int] = Field(ge=0, le=6, unique_items=True,description="")

相关内容

  • 没有找到相关文章

最新更新