如何优雅地将字典字符串日期转为Pydantic对象的datetime属性
实现Pydantic自动转换字符串日期为datetime类型
情况1:标准ISO 8601格式日期字符串
你的代码其实已经可以直接实现需求——Pydantic的BaseModel默认支持将符合ISO 8601格式的字符串自动解析为datetime对象。只需注意避免使用内置类型名dict作为变量名:
from datetime import datetime from pydantic import BaseModel class MyClass(BaseModel): base: str success: bool date: datetime # 重命名变量,避免覆盖内置dict类型 dict_data = { "base": "abc", "success": True, "date": "2023-04-30" } obj = MyClass(**dict_data) print(type(obj.date)) # 输出:<class 'datetime.datetime'>
情况2:自定义日期格式
如果你的日期字符串是非ISO格式(比如"30/04/2023"),可以通过字段验证器实现自定义解析逻辑:
Pydantic v2版本
使用@field_validator装饰器,并设置mode='before'让自定义逻辑在默认解析前执行:
from datetime import datetime from pydantic import BaseModel, field_validator class MyClass(BaseModel): base: str success: bool date: datetime @field_validator('date', mode='before') def parse_custom_date(cls, value): if isinstance(value, str): # 按照自定义格式解析,这里示例为DD/MM/YYYY return datetime.strptime(value, "%d/%m/%Y") return value dict_data = { "base": "abc", "success": True, "date": "30/04/2023" } obj = MyClass(**dict_data) print(obj.date) # 输出:2023-04-30 00:00:00
Pydantic v1版本
使用@validator装饰器:
from datetime import datetime from pydantic import BaseModel, validator class MyClass(BaseModel): base: str success: bool date: datetime @validator('date') def parse_custom_date(cls, value): if isinstance(value, str): return datetime.strptime(value, "%d/%m/%Y") return value
内容的提问来源于stack exchange,提问作者Alex K.
相关产品推荐
相关产品推荐

