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

Pydantic 2.0忽略Optional标记,字段被要求必填问题求助

Pydantic 2.0 中 Optional 字段变为必填的问题解决

问题原因

Pydantic 2.0 对字段可选性的判定逻辑做了重大调整:

  • 在 1.X 版本中,Optional[str] 会自动将字段标记为可选(允许请求体不传入,默认值为 None)。
  • 但在 2.0 版本中,Optional[str] 仅表示字段的类型可以是 str 或 None,并不会自动设置默认值。如果没有显式指定默认值,Pydantic 会将该字段视为必填项,因此请求体中缺少该字段时会返回 422 验证错误。

解决方案

1. 显式设置字段默认值为 None

这是最直接且推荐的方式,只需在字段注解后添加 = None,即可让字段恢复可选性:

class VerifyReceiptIn(BaseModel):
    device_id: str
    device_type: DeviceType
    receipt: Optional[str] = None

对于 Python 3.10+,也可以用更简洁的联合类型写法:

class VerifyReceiptIn(BaseModel):
    device_id: str
    device_type: DeviceType
    receipt: str | None = None

2. 使用 Pydantic Field 显式声明默认值

如果需要对字段添加额外描述或约束,可以用 Field 来明确设置默认值:

from pydantic import Field

class VerifyReceiptIn(BaseModel):
    device_id: str
    device_type: DeviceType
    receipt: Optional[str] = Field(default=None, description="可选的收据字符串")

注意事项

  • 避免依赖全局配置修改默认行为,这可能会影响其他模型的字段验证逻辑,增加维护风险。
  • 修改后无需在请求体中传入 receipt=None,请求体中不包含该字段时,Pydantic 会自动将其赋值为 None,与 1.X 版本的行为保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:49:58