如何使用Pydantic为单个字段设置Datetime和Null两种允许的类型
Pydantic字段同时支持Datetime和Null的实现方法
你预期的validated_at:Opt[Datetime], Opt[Null]写法不符合Python类型注解语法,无法直接生效,可通过以下方式实现需求:
方案1:直接复用现有Opt定义(推荐)
如果你代码中的Opt是typing.Optional的别名,你当前写的validated_at: Opt[Datetime]本身就已经满足需求。Optional[T]的底层定义就是Union[T, None],天然允许传入合法Datetime值或者Null(Python中对应None),不需要额外修改。
方案2:显式声明联合类型
如果需要更直观的标注允许的两种类型,可按Python版本选择写法:
- Python 3.10及以上版本,用管道符简化写法:
validated_at: Datetime | None
- Python 3.9及以下版本,用
typing.Union声明:
from typing import Union validated_at: Union[Datetime, None]
异常排查
如果按上述配置后仍不允许传入空值,可检查两个常见问题:
- 确认项目中自定义的
Opt确实是typing.Optional的别名,没有被重写为非空类型 - 检查
validated_at对应的Field配置中是否手动加了nullable=False参数,移除该参数即可
修改后的完整类示例如下:
class Fdes(FdesCreate): """FDES Validation Schema for get requests""" id: PyObjectId = Field(default_factory=PyObjectId, alias="_id") created_at: Datetime updated_at: Datetime # 以下两种写法二选一即可,效果完全一致 validated_at: Opt[Datetime] # validated_at: Datetime | None archived_at: Opt[Datetime]
内容的提问来源于stack exchange,提问作者Howins
相关产品推荐
相关产品推荐

