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

Pydantic V2迁移:@field_validator替代@validator后values参数的等价方案

Pydantic V2中如何在字段验证器中引用其他已验证字段的值?

问题背景

正在将代码从Pydantic V1迁移至V2,想用@field_validator替代废弃的@validator。之前在V1的验证器里用values参数获取其他已验证字段的值,但V2的@field_validator不再传入values参数,迁移文档没提等价方案,求V2的推荐实现方式。

V1原验证器代码:

from pydantic import BaseModel, validator

class User(BaseModel):
    password1: str
    password2: str

    @validator('password2')
    def passwords_match(cls, v, values, **kwargs):
        if 'password1' in values and v != values['password1']:
            raise ValueError('passwords do not match')
        return v

解决方案

在Pydantic V2中有两种常用方式实现这种跨字段验证,以下是对应示例:

方式1:通过info参数+depends_on(推荐)

使用info参数访问已提交的字段数据,配合depends_on确保依赖字段先完成验证:

from pydantic import BaseModel, field_validator

class User(BaseModel):
    password1: str
    password2: str

    @field_validator('password2', depends_on=['password1'])
    def passwords_match(cls, v, info):
        if v != info.data['password1']:
            raise ValueError('passwords do not match')
        return v
  • depends_on=['password1']会强制password1先被验证,确保info.data中存在可靠的已验证值
  • info.data是包含所有已提交字段的字典

方式2:使用mode='after'后置验证

设置mode='after'后,验证器会在所有字段完成基础验证后执行,此时可以直接通过实例访问其他字段:

from pydantic import BaseModel, field_validator

class User(BaseModel):
    password1: str
    password2: str

    @field_validator('password2', mode='after')
    def passwords_match(self, v):
        if v != self.password1:
            raise ValueError('passwords do not match')
        return v
  • 这种方式下验证器是实例方法,第一个参数为self,可以直接访问模型的其他字段
  • 适合需要在所有字段都验证完成后进行的跨字段检查

内容的提问来源于stack exchange,提问作者Daniel Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:32:48