
在 Pydantic 数据类中,若希望某字段的默认值动态依赖于另一字段(如 label 默认为 name + "_label"),需启用 validate_default=True 配置并配合 mode="before" 字段验证器,否则默认值不会触发验证逻辑。
在 pydantic 数据类中,若希望某字段的默认值动态依赖于另一字段(如 `label` 默认为 `name + "_label"`),需启用 `validate_default=true` 配置并配合 `mode="before"` 字段验证器,否则默认值不会触发验证逻辑。
Pydantic 默认跳过对字段默认值的验证——这意味着即使你为 label 定义了 field_validator,当用户未显式传入 label(即使用 Field(default=None))时,验证器根本不会执行,label 将保持原始默认值 None,而非你期望的计算结果。
要解决此问题,核心在于两步配置:
- 启用默认值验证:通过 ConfigDict(validate_default=True) 显式开启对默认值的校验;
- 使用 mode="before" 的验证器:确保在字段赋值前(甚至在默认值被应用前)介入,读取当前已解析的其他字段(如 name)并动态生成值。
以下是一个完整、可运行的示例:
from pydantic import Field, field_validator, ConfigDict
from pydantic.dataclasses import dataclass
import uuid
def foo(name: str) -> str:
return f"{name}_label"
@dataclass(config=ConfigDict(validate_default=True)) # ✅ 关键:启用默认值验证
class MyClass:
name: str = Field(default="class_name")
label: str = Field(default=None) # 默认为 None,将由验证器覆盖
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
@field_validator("label", mode="before") # ✅ mode="before" 可访问 info.data
@classmethod
def set_default_label(cls, v, info):
if v is None:
# info.data 包含已解析的其他字段(如 name),此时 name 已确定
v = foo(info.data.get("name", "unnamed"))
return v
✅ 验证效果:
print(MyClass()) # 使用全部默认值 # 输出:MyClass(name='class_name', label='class_name_label', id='...') print(MyClass(name="widget")) # 仅指定 name # 输出:MyClass(name='widget', label='widget_label', id='...') print(MyClass(name="custom", label="override")) # 显式指定 label # 输出:MyClass(name='custom', label='override', id='...')
⚠️ 注意事项:
- validate_default=True 是必需配置,缺省为 False,这是本问题的根本原因;
- mode="before" 是推荐模式(尤其用于依赖其他字段的默认值推导),它允许你在字段值被类型转换前访问 info.data(即当前已解析的字段字典);mode="after" 不适用,因 label 尚未赋值,info.data 中无该字段;
- 验证器必须声明为 @classmethod(Pydantic 要求),且参数签名需符合 def func(cls, v, info);
- 若 name 字段本身也可能为 None 或未设置,建议在 foo() 调用前做健壮性检查(如 info.data.get("name", ...));
- 此方案适用于 Pydantic v2+(pydantic.dataclasses 模块),不兼容 v1 的 BaseModel 语法。
总结:动态默认值 ≠ 自动触发验证。只有显式启用 validate_default 并合理设计验证时机(mode="before"),才能让 Pydantic 在构造对象时真正“理解”字段间的依赖关系,实现安全、可预测的默认行为。










