Pydantic v2 模型中实现条件性必填字段
本文介绍了如何在 Pydantic v2 模型中实现条件性必填字段,以对应 API 接口返回字段可选,但创建对象时部分字段必须的要求。通过自定义模型验证器,可以在模型验证阶段检查是否满足特定条件,从而实现字段的条件性必填。利用 model_validator 实现条件性必填
在 Pydantic v2 中,可以通过model_validator 装饰器自定义模型验证器,实现更灵活的字段验证逻辑。以下展示如何创建一个基类,确保模型至少有一个字段不为 None,从而实现条件性必填的效果。from 输入 import Selffrom pydantic import HttpUrl, BaseModel, PositiveInt, model_validatorclass AllRequired(BaseModel): @model_validator(mode='after') def not_all_none(self) -gt; Self: if all(v is None) for _, v in self): raise ValueError('至少必须提供一个值') return selfclass InvoiceItem(AllRequired): quot;quot;quot; 表示发票的 Pydantic 模型 quot;quot;quot; id: PositiveInt | None = None org: HttpUrl | None = NonerelatedInvoice: HttpUrl | None = None amount: PositiveInt | None = Nonetry: InvoiceItem(id=None, org=None, relatedInvoice=None,Quantity=None) # Invalid item except ValueError as e: print(e)登录后复制
代码解释:AllRequired 基类:定义了一个 AllRequired 基类,继承自 BaseModel。@model_validator(mode='after') 装饰器:使用 model_validator 装饰器定义了一个名为not_all_none 的模型验证器。mode='after' 表示该验证器在所有字段验证之后执行。not_all_none 方法:该方法遍历模型的所有字段,检查所有字段的值是否都为 None。如果是,则抛出一个 ValueError 异常,提示用户至少需要提供一个字段的值。Self 是Python 3.11 导入的类型提示,等价于 AllRequired。InvoiceItem 模型:定义了一个 InvoiceItem模型,继承自AllRequired。
该模型的所有字段都是可选的,但由于继承了 AllRequired,因此在创建 InvoiceItem 对象时,必须至少提供一个字段的值。
运行结果:
上述代码会抛出 ValueError: At least one value must beprovided 异常,因为创建 InvoiceItem 对象时,所有字段的值都为 None。其他条件性验证
除了验证所有字段是否都为 None 之外,还可以通过 model_validator实现更复杂的条件性。例如,可以根据某个字段的验证值来决定其他字段是否提供。fromtypes import Selffrom pydantic import BaseModel, model_validatorclass ConditionalRequired(BaseModel): field_a: str | None = None field_b: int | None = None field_c:float | None = None @model_validator(mode='after') def verify_fields(self) -gt; Self: if self.field_a == quot;require_bquot;: if self.field_b is None: raise ValueError(quot;当field_a为'require_b'时field_b是必需的quot;) if self.field_a == quot;require_cquot;: if self.field_c is None: raise ValueError(quot;当field_a为'require_c'时field_c是必需的quot;) return self# 测试实例try: ConditionalRequired(field_a=quot;require_bquot;)except ValueError as e: print(e)try: ConditionalRequired(field_a=quot;require_cquot;)except ValueError as e: print(e)print(ConditionalRequired(field_a=quot;require_bquot;, field_b=10))print(ConditionalRequired(field_a=quot;require_cquot;,field_c=3.14))登录后复制
代码解释:ConditionalRequired模型:定义了三个字段field_a,field_b,和field_c,都是可选的。validate_fields方法:该方法根据field_a的值来决定field_b和field_c是否必须提供。
如果 field_a 的值为 "require_b",则 field_b 必须提供;如果 field_a 的值为 "require_c",则 field_c 必须提供。注意事项 model_validator 装饰器必须评估类方法。mode='after' 表示验证器在所有字段之后验证执行。验证器方法必须返回模型自身 (Self)。可以使用 raise ValueError 提交验证错误。总结
通过 model_validator,可以在 Pydantic v2模型中实现复杂的条件性验证逻辑,从而更好地满足实际应用的需求。这种方法允许你定义基于模型状态的验证规则,从而保证数据的一致性和一致性。这种方法比多个继承模型更灵活,也避免了代码逻辑。
以上就是Pydantic v2模型中实现条件性必填字段的详细,更多请关注哥乐内容常识网其他相关文章!