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
相关产品推荐
相关产品推荐

