将Pydantic从1.x升级到2.x时的字段初始化异常问题
问题原因与解决方案
问题根源
Pydantic 2 对类型注解的处理逻辑发生了关键变化:在 Pydantic 1 中,str | None(或Optional[str])类型的字段会自动赋予默认值None;但在 Pydantic 2 中,该类型仅表示字段允许取值为None,不会自动设置默认值,若未显式指定默认值,字段仍会被判定为必填项。
你的_Sub类中value1: str | None未设置默认值,当_Supra通过default_factory=_Sub初始化sub_value2时,调用_Sub()会因value1为必填字段却无输入而抛出验证错误。
解决方案
给_Sub的value1字段显式设置默认值None,同时建议给_Supra的supra_value1也补充默认值(避免出现同类问题):
from pydantic import BaseModel, Field class _Sub(BaseModel): value1: str | None = None # 显式设置默认值 class _Supra(BaseModel): supra_value1: str | None = None # 同步补充默认值 sub_value2: _Sub = Field(default_factory=_Sub)
此时执行foo = _Supra(**{})即可正常生成实例,效果与 Pydantic 1 一致。
补充说明
你尝试的Optional[_Sub]、_Sub|None等父模型字段类型调整,并未触及问题核心——子模型的必填字段未设置默认值,因此无法解决报错。
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

