繁体   English   中英

如何在 model 中更改列表项时验证它们?

[英]How to validate list items when they change in a pydantic model?

我在 pydantic model 中有一个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引发错误。

如果我尝试重新创建 object(如预期的那样),我会收到错误消息

A(**a.dict())

甚至允许附加错误的类型。 为什么这不会破坏 model?

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

这类似于/扩展: How to validate a pydantic object after editing it

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="")


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM