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

