You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:18:17