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
相关产品推荐
相关产品推荐

