pydantic验证器如何访问第二个属性



如何让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验证器。

相关内容

  • 没有找到相关文章

最新更新