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

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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:06