Pydantic对含自定义模型的Optional字段返回‘field required’错误
问题分析与解决方案
问题本质
你遇到的验证错误核心原因是:Pydantic解析twitter_account字段时,收到的是**空字典{}**而非None。虽然你声明了Optional['TwitterAccount'],但空字典会触发Pydantic尝试将其解析为TwitterAccount实例,而TwitterAccount的必填字段缺失,因此抛出"Field required"错误。
改为Optional[List['TwitterAccount']]能运行的原因是:空列表[]是合法的列表类型,不需要解析单个TwitterAccount实例,自然不会触发必填字段的验证,但这显然不符合你的业务逻辑。
解决方案
方案1:确保数据源返回None而非空字典
如果数据来自ORM(如SQLAlchemy)或其他数据源,检查关联字段的返回逻辑:当用户无关联Twitter账号时,确保twitter_account字段返回None,而非空对象/空字典。
比如在SQLAlchemy中,确保关系字段设置nullable=True,查询时不会返回空的关联对象实例。
方案2:用Pydantic验证器转换空字典为None
若无法修改数据源返回结果,可添加前置验证器,自动将空字典转为None:
from pydantic import BeforeValidator, BaseModel from fastapi_users import schemas import uuid def empty_dict_to_none(value): return None if value == {} else value class TwitterAccount(BaseModel): # 你的必填字段定义 id: int username: str class UserRead(schemas.BaseUser[uuid.UUID]): twitter_account: Optional['TwitterAccount'] = BeforeValidator(empty_dict_to_none) # 更新前置引用 UserRead.update_forward_refs()
方案3:显式指定字段默认值为None
在字段定义中添加default=None,确保字段不存在时自动填充None,避免空字典触发的验证:
class UserRead(schemas.BaseUser[uuid.UUID]): twitter_account: Optional['TwitterAccount'] = None
注意:若数据源主动返回空字典,此方案可能不生效,优先使用方案2。
内容的提问来源于stack exchange,提问作者Jakub Królikowski
相关产品推荐
相关产品推荐

