Pydantic v1转v2:@validator迁移@field_validator问题咨询
Pydantic v1 → v2 迁移方案:@validator 转 @field_validator
直接上迁移后的完整代码:
from typing import Optional, Union, List, Dict from pydantic import BaseModel, field_validator, ValidationInfo # 假设你定义了task_required字典,示例如下: task_required = { "download": ["name", "pwd"], "process": ["depends_on", "features"] } class Task(BaseModel): task_type: str # 原代码依赖但未定义,此处补上 name: Optional[str] pwd: Optional[str] depends_on: Optional[Union[str, List[str]]] = [] features: Optional[Dict] = {} @field_validator("name", "pwd", "depends_on", "features", validate_default=True) def validate_required_fields(cls, value, info: ValidationInfo): task_type = info.data.get("task_type") # 获取当前验证的字段名 current_field_name = info.field.name for task, required_fields in task_required.items(): if task_type == task and current_field_name in required_fields: if not value: raise ValueError(f"{current_field_name} 是任务类型 '{task_type}' 的必填字段") return value
关键变化说明
- 替代
always=True:用validate_default=True参数,作用和v1的always=True完全一致——不管字段有没有显式传值,哪怕用了默认值(比如depends_on = []),都会触发验证。 - 获取字段名:通过
ValidationInfo对象的info.field.name拿到当前正在验证的字段名,替代v1里直接传入的field参数。 - 获取其他字段值:原代码里的
values.get("task_type")改成info.data.get("task_type"),info.data包含当前模型实例已验证过的所有字段数据。
额外注意
- 原代码依赖
task_type但未在Task类中定义,迁移时必须补上该字段,否则info.data无法获取对应值。 - 如果
task_type的定义顺序在被验证字段之后,可能出现info.data取不到值的情况,此时需要把task_type放到类的最前面,确保它先被验证。
内容的提问来源于stack exchange,提问作者sa_
相关产品推荐
相关产品推荐

