如何让pydantic验证器针对另一个类对象(不是另一个输入arg,而是类定义中的另一个对象,如属性或函数(验证输入-->我很乐意打电话给self.xx
。
因此,我知道如何根据另一个输入arg验证一个输入arg(例如,如果plant
是树,则验证color
是否为绿色(:
from pydantic import BaseModel, validator
class MyClass(BaseModel):
plant: str
color: str
@validator('color')
def tree_is_green(cls, v, values, **kwargs):
if values['plant'] == 'tree':
if v != 'green':
raise ValueError('tree must be green')
return v
它会在蓝色的树上吠叫,而玫瑰可以是任何颜色:
my_plant = MyClass(color='blue', plant='rose') # works
my_plant = MyClass(color='blue', plant='tree') # fails
my_plant = MyClass(color='green', plant='tree') # works
到目前为止,一切都很好。
现在,我该如何对此进行概括,并使用property
?假设验证器变得比==
更复杂,并且我不想将我的函数和属性的所有功能复制/粘贴到验证器中。
from pydantic import BaseModel, validator
class MyClass(BaseModel):
plant: str
color: str
@property
def is_tree(self) -> bool:
return self.plant == 'tree'
@validator('color')
def tree_is_green(cls, v, values, **kwargs):
if values['is_tree'] is True:
if v != 'green':
raise ValueError('tree must be green')
return v
无论我试图创建什么实例,上面的代码总是失败:
my_plant = MyClass(color='green', plant='tree')
>>> KeyError: 'is_tree'
我不顾一切地试图用cls
取代values[]
,但没有成功。使用以下内容永远不会返回错误,而且它根本不会验证任何内容:
from pydantic import BaseModel, validator
class MyClass(BaseModel):
plant: str
color: str
@property
def is_tree(self) -> bool:
return self.plant == 'tree'
@validator('color')
def tree_is_green(cls, v, values, **kwargs):
if cls.is_tree is True:
if v != 'green':
raise ValueError('tree must be green')
return v
导致不需要的输出:
my_plant = MyClass(color='blue', plant='tree')
print(my_plant)
plant='tree' color='blue'
有没有任何方法可以构建一个基于类的功能/对象的验证器,而不仅仅是输入参数或静态变量?从概念上讲,它应该起作用,因为属性is_tree
不依赖于color
,所以任何形式的循环引用都被排除在外。。如果它爆炸了,我会谦虚地接受它,并想出一个更好的验证器。。
您可以通过向验证器支付另一个参数values
来访问其他值,请参阅此处的passwords_match
验证器。