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

Pydantic嵌套模型使用None值时出现校验错误该如何解决

问题原因与解决方案

核心报错原因

  • 字段类型未显式声明允许为None:Pydantic默认做严格类型校验,你声明的Emails: List[Emails] = None写法不规范,仅给默认值None不会自动被识别为允许None类型,需要显式标记字段可接收None值。
  • 实例化语法错误:你写的User('Emails': [xxx])不符合Python传参语法,关键字参数不能用引号包裹键,传入字典参数需要用**解包。
  • 存在未适配的额外字段:报错信息中出现Phones相关校验错误,说明你实际运行的代码中User模型还定义了Phones字段,但该字段同样没有正确声明允许为None类型,也没有传入合法值。
  • 布尔值写法错误:Python原生布尔值为True/False,你代码中的小写true会直接触发NameError。

修复后的代码

from pydantic import BaseModel
from typing import List, Optional

class Emails(BaseModel):
    Type: int
    # 用Optional标记字段允许为str或None,和默认值匹配
    Value: Optional[str] = None
    IsPrimary: bool

class User(BaseModel):
    # 标记Emails字段允许为列表或None
    Emails: Optional[List[Emails]] = None
    # 如果有Phones字段也需要做同样声明,示例如下:
    # Phones: Optional[List[你的Phone模型]] = None

# 正确实例化方式1:直接传关键字参数
user = User(
    Emails = [
        {'Type': 0, 'Value': 'qwert@gmail.com', 'IsPrimary': True},
        {'Type': 1, 'Value': 'qpoefk@outlook.com', 'IsPrimary': True}
    ]
)

# 正确实例化方式2:传入字典参数需要用**解包
input_dict = {
    'Emails': [
        {'Type': 0, 'Value': 'qwert@gmail.com', 'IsPrimary': True},
        {'Type': 1, 'Value': 'qpoefk@outlook.com', 'IsPrimary': True}
    ]
}
user = User(**input_dict)

补充说明

如果你使用的是Pydantic V2版本,也可以用更简洁的类型 | None写法替代Optional,比如Emails: list[Emails] | None = None,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:09:03