【发布时间】:2019-05-30 03:08:16
【问题描述】:
我正在使用 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,它将失败。
有没有办法创建这样一个只能由另一个人计算并且仍然可以是Optional的字段?
【问题讨论】:
-
@normanius 我的错,忘记了
allow...和fields在内部 Config 类中 -
顺便说一句,我正在尝试使用 python 3.6.1 和 pydantic 0.16.1
-
较新版本的 pydantic(从 0.20 开始)可以更好地处理您的用例。