gpt4 book ai didi

python - Pydantic:根据其他字段的值在验证器中使字段为 None

转载 作者:行者123 更新时间:2023-12-02 09:20:26 25 4
gpt4 key购买 nike

我正在将 pydantic BaseModel 与这样的验证器一起使用:

from datetime import date
from typing import List, Optional
from pydantic import BaseModel, BaseConfig, validator

class Model(BaseModel):
class Config(BaseConfig):
allow_population_by_alias = True
fields = {
"some_date": {
"alias": "some_list"
}
}
some_date: Optional[date]
some_list: List[date]

@validator("some_date", pre=True, always=True)
def validate_date(cls, value):
if len(value) < 2: # here value is some_list
return None
return value[0] # return the first value - let's assume it's a date string

# This reproduces the problem
m = Model(some_list=['2019-01-03'])

我想根据 some_list 的值计算 some_date 的值,并在满足特定条件时将其设为None

我的 JSON 从未包含字段 some_date,它始终基于 some_list 填充,因此 pre=True, always=True。但是,some_date 的默认验证器将在我的自定义验证器之后运行,如果 validate_date 返回 None,验证器将会失败。

有没有一种方法可以创建这样一个仅由另一个字段计算的字段,并且仍然可以是可选

最佳答案

如果您希望能够根据另一个字段动态修改一个字段,可以使用values争论。它包含之前的所有字段,并且要小心:顺序很重要。您可以使用 validator 来执行此操作或root_validator .

带有 validator

>>> from datetime import date
>>> from typing import List, Optional
>>> from pydantic import BaseModel, validator
>>> class Model(BaseModel):
some_list: List[date]
some_date: Optional[date]

@validator("some_date", always=True)
def validate_date(cls, value, values):
if len(values["some_list"]) < 2:
return None
return values["some_list"][0]

>>> Model(some_list=['2019-01-03', '2020-01-03', '2021-01-03'])
Model(some_list=[datetime.date(2019, 1, 3), datetime.date(2020, 1, 3), datetime.date(2021, 1, 3)],
some_date=datetime.date(2019, 1, 3))

但正如我所说,如果你交换 some_list 的顺序和some_date ,您将拥有 KeyError: 'some_list' !

带有 root_validator

另一种选择是使用 root_validator 。这些作用于所有字段:

>>> class Model(BaseModel):
some_list: List[date]
some_date: Optional[date]

@root_validator
def validate_date(cls, values):
if not len(values["some_list"]) < 2:
values["some_date"] = values["some_list"][0]
return values

>>> Model(some_list=['2019-01-03', '2020-01-03', '2021-01-03'])
Model(some_list=[datetime.date(2019, 1, 3), datetime.date(2020, 1, 3), datetime.date(2021, 1, 3)],
some_date=datetime.date(2019, 1, 3))

关于python - Pydantic:根据其他字段的值在验证器中使字段为 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54023782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com