我有一个pydantic模型。其中一个字段必须由用户提供,但是,第二个字段可以存在,但是如果缺少则完全可以。
在缺少age
的情况下,我根本不希望它出现在pydantic模型实例上。
我的模型:
from pydantic import BaseModel
class Employee(BaseModel):
name: str
age: Optional[int]
问题:
e = Employee(name="Harwey Smith")
e.age # Has age parameter equal to None, even if not provided.
我如何设置我的雇员pydantic模型不具有age
属性,如果它没有在init上提供?如果我尝试访问e.nonexistent
属性,则会抛出AttributeError
。这是我想发生的e.age
,如果没有提供。
在我看来,你的情况是相当不寻常的,我总是喜欢有一个None
值的字段。我认为它更简单,如果我们考虑到任何IDE都会为age
显示的类型提示,那么接收AttributeError
是出乎意料的。话虽如此,如果您使用@rootvalidator
来删除age
字段,您想要的是可能的:
from typing import Any, Dict, Optional
from pydantic import BaseModel, root_validator
class Employee(BaseModel):
name: str
age: Optional[int]
@root_validator(skip_on_failure=True)
def _remove_age_if_none(cls, values: Dict[str, Any]) -> Dict[str, Any]:
if "age" in values and values["age"] is None:
del values["age"]
return values
e = Employee(name="Harwey Smith")
print(e.age)
输出:
AttributeError: 'Employee' object has no attribute 'age'
这种方法是我在Pydantic文档中没有看到的,但是我看到了一些答案,表明@rootvalidator
可以用来删除字段。在我看来,这种行为很奇怪,如果Pydantic在未来的版本中有所改变,我也不会感到惊讶。小心。