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

Pydantic 2.0中如何将嵌套BaseModel类设为可选?

在Pydantic 2.0中设置自定义BaseModel为可选字段的正确方式

你遇到的核心问题是:仅用Optional[CustomModel]标注字段类型,但未设置默认值None,导致字段仍被视为必填(必须传入该字段,哪怕值是None),完全不传字段时就会触发「字段缺失」的验证错误。

正确实现步骤

要让自定义BaseModel类型的字段真正可选(既可以不传,也可以传None/null),需要同时满足两个条件:

  1. 用Optional[T]标注类型,允许字段值为T或None
  2. 给字段设置默认值None,让字段成为非必填项

完整代码示例

from pydantic import BaseModel
from typing import Optional

# 自定义BaseModel类
class Profile(BaseModel):
    name: str
    age: int

class Connections(BaseModel):
    github: str
    linkedin: str

# 正确定义可选字段的User类
class User(BaseModel):
    username: str
    # 关键:Optional[T] + 默认值None
    profile: Optional[Profile] = None
    connections: Optional[Connections] = None

验证测试

以下场景都不会触发验证错误:

# 场景1:完全不传可选字段
user1 = User(username="alice")
print(user1.profile)  # 输出:None

# 场景2:传入可选字段为None
user2 = User(username="bob", profile=None, connections=None)
print(user2.connections)  # 输出:None

# 场景3:传入符合自定义模型结构的数据
user3 = User(
    username="charlie",
    profile={"name": "Charlie", "age": 30},
    connections={"github": "charlie123", "linkedin": "charlie-doe"}
)
print(user3.profile.name)  # 输出:Charlie

常见误区说明

如果你的代码仅写了profile: Optional[Profile](未加= None),Pydantic会认为该字段是必填但允许值为None——也就是说必须传入这个字段(哪怕值是None),但完全不传的话就会报错,这就是你遇到的问题。

额外配置(可选)

如果需要给字段添加描述、示例等额外属性,可以结合Field工具,效果和直接设= None一致:

from pydantic import Field

class User(BaseModel):
    username: str
    profile: Optional[Profile] = Field(default=None, description="用户个人资料,可选")
    connections: Optional[Connections] = Field(default=None, description="社交链接,可选")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:06