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
相关产品推荐
相关产品推荐

