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

Pydantic 2.7 date_from_datetime_parsing错误求助:日期转换失败

问题分析与解决方案

错误原因

你的验证器存在几个关键问题导致日期转换失败:

  • info.mode判断逻辑错误:info.mode代表的是验证模式(如before/after),并非字段的数据类型。你需要判断的是字段是否为date类型,应该通过info.field.annotation来获取字段的注解类型。
  • 返回类型注解不匹配:验证器注解标注返回datetime.date,但实际可能返回None或原始字符串,类型不匹配会触发Pydantic后续的验证报错。
  • 转换失败未处理:当两次日期转换都失败时,你仅用pass后返回原始字符串,此时Pydantic自带的日期解析器会尝试处理该字符串,但它默认不支持DD/MM/YYYY格式,因此抛出解析错误。

修正后的验证器代码

from datetime import datetime, date
from pydantic import FieldValidationInfo, field_validator, ValidationError

class _BaseSchema:
    @field_validator('*', mode='before')
    def convert_str_to_date(cls, v, info: FieldValidationInfo):
        """Convertendo de string para date/datetime, notações BR e ISO"""
        # 跳过空值或非字符串输入
        if not v or not isinstance(v, str):
            return v
        
        # 获取字段的目标类型(兼容可选类型如date | None)
        field_type = info.field.annotation
        origin_type = getattr(field_type, '__origin__', field_type)
        
        # 处理date类型字段
        if origin_type is date:
            if v in ('00/00/0000', '00000000'):
                return None
            try:
                return datetime.strptime(v, '%d/%m/%Y').date()
            except ValueError:
                try:
                    return datetime.strptime(v[:10], '%Y-%m-%d').date()
                except ValueError:
                    # 转换失败返回None(符合字段默认值设定),也可根据需求抛出ValidationError
                    return None
        # 处理datetime类型字段(适配date_procedure字段)
        elif origin_type is datetime:
            if v in ('00/00/0000 00:00:00', '00000000000000'):
                return None
            try:
                return datetime.strptime(v, '%d/%m/%Y %H:%M:%S')
            except ValueError:
                try:
                    return datetime.fromisoformat(v[:19])
                except ValueError:
                    return None
        # 其他类型直接返回原值
        return v

额外说明

  • 针对date | None这类可选类型,通过__origin__获取原始类型,确保判断逻辑准确。
  • 转换失败时返回None,匹配你字段的默认值设定,避免Pydantic默认解析器报错。如果需要严格校验,可在最后一次ValueError中抛出ValidationError。

内容的提问来源于stack exchange,提问作者Lucca Torrezilha Soares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:50:19