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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:42:53