我正在使用 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_date
的值 some_list
并使其成为 None
如果满足特定条件。
我的 JSON 从不包含字段 some_date
,它总是基于 some_list
填充,因此 pre=True, always=True
。但是 some_date
的默认验证器将 在 我的自定义验证器之后运行,如果 validate_date
返回 None
,它将失败。
有没有办法创建这样一个仅由另一个计算的字段,并且仍然可以是 Optional
?
原文由 Dániel Nagy 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:正如其他人指出的那样,现在可以使用较新的版本(>=0.20)来完成。看到 这个答案。 (旁注:即使 OP 的代码现在也能正常工作,但不使用别名就更好了。)
从略读文档和 pydantic 的来源,我倾向于说 pydantic 的验证机制目前对验证函数中的类型转换(
list -> date
,list -> NoneType
)的支持非常有限。然而,退后一步,您使用
alias
和标志allow_population_by_alias
的方法似乎有点过载。some_date
只需要作为some_list[0] if len(some_list) >= 2 else None
的快捷方式,但它永远不会独立于some_list
设置。如果真是这样,为什么不选择以下选项呢?