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

如何优雅地将字典字符串日期转为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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:15:07