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

如何在Pydantic类型验证器中获取实际模型以读取Field元数据?

在Pydantic验证器中获取模型并读取Field元数据的解决方案

要在Pydantic验证器中获取模型类及Field元数据,关键是利用WrapValidator提供的完整ValidationInfo上下文,以下是具体实现方案:

核心实现代码

from typing import Annotated, TypeVar
from pydantic import BaseModel, WrapValidator, Field, ValidationInfo

T = TypeVar('T')

def use_default_if_none(v: T | None, info: ValidationInfo) -> T:
    if v is None:
        # 通过ValidationInfo获取当前字段对应的Field对象
        current_field = info.model_fields[info.field_name]
        # 读取Field的默认值(或自定义元数据)
        default_val = current_field.default
        # 若需读取自定义元数据,示例:
        # custom_metadata = current_field.metadata.get("custom_key")
        return default_val
    return v

# 定义带验证器的注解类型
IntDefault = Annotated[int, WrapValidator(use_default_if_none)]

class Data(BaseModel):
    a: IntDefault = Field(default=42, metadata={"custom_note": "自定义元数据示例"})

# 测试
print(Data(a=None))  # 输出: a=42

关键说明

  • 用WrapValidator替代BeforeValidator:前者能提供包含model_class、model_fields等属性的完整ValidationInfo,而BeforeValidator的上下文信息有限
  • 读取模型与字段信息:
    • info.model_class:获取当前验证的模型类本身
    • info.model_fields[info.field_name]:定位当前字段对应的Field对象,进而读取其中的default、metadata等元数据
    • info.data:已完成验证的其他字段数据(验证阶段模型实例尚未完全构建,无法直接获取实例)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:00:05