如何在Pydantic中让field_validator访问可选字段进行校验?
问题:Pydantic field_validator 访问可选字段报错
场景需求
当plant取值为'flower'时,必须提供color字段;其他植物类型无需该字段(color为可选字段)。
原代码实现
from typing import Optional from pydantic import BaseModel, field_validator from pydantic_core.core_schema import FieldValidationInfo class MyClass(BaseModel): plant: str color: Optional[str] = None @field_validator('plant') def flowers_have_color(cls, v, info: FieldValidationInfo): if v == 'flower': if info.data['color'] is None: raise ValueError("if 'plant' is a flower, it must have a color") return v
预期行为
>>> MyClass(plant='tree') # ok MyClass(plant='tree', color=None) >>> MyClass(plant='tree', color='red') # ok MyClass(plant='tree', color='red') >>> MyClass(plant='flower') # raise >>> MyClass(plant='flower', color='red') # ok MyClass(plant='flower', color='red')
遇到的问题
运行时抛出KeyError: 'color',因为field_validator中的info.data不包含未显式传入的可选字段。已知可以用model_validator解决,但希望用field_validator实现。
解决方案
问题根源在于字段校验的执行顺序:plant字段先被校验,此时未显式传入的可选字段color不会出现在info.data中。以下两种方式可解决:
方式1:将校验器mode设为'after'
指定mode='after'后,所有字段解析完成再执行校验,info.data会包含所有字段(包括默认值):
from typing import Optional from pydantic import BaseModel, field_validator from pydantic_core.core_schema import FieldValidationInfo class MyClass(BaseModel): plant: str color: Optional[str] = None @field_validator('plant', mode='after') def flowers_have_color(cls, v, info: FieldValidationInfo): if v == 'flower' and info.data['color'] is None: raise ValueError("if 'plant' is a flower, it must have a color") return v
方式2:校验color字段而非plant
换校验目标为color,同样通过mode='after'确保能获取plant的取值:
from typing import Optional from pydantic import BaseModel, field_validator from pydantic_core.core_schema import FieldValidationInfo class MyClass(BaseModel): plant: str color: Optional[str] = None @field_validator('color', mode='after') def flower_requires_color(cls, v, info: FieldValidationInfo): if info.data['plant'] == 'flower' and v is None: raise ValueError("flower must have a color") return v
两种方式均无需使用model_validator即可满足需求。
内容的提问来源于stack exchange,提问作者KingOtto
相关产品推荐
相关产品推荐

