FastAPI中如何在Pydantic模型自定义15-Jul-1996格式日期
在FastAPI的Pydantic模型中约束日期为15-Jul-1996格式
默认的date类型仅支持ISO标准格式(如YYYY-MM-DD)或部分地区格式,要强制验证15-Jul-1996这种DD-Mon-YYYY格式的输入,可通过字段验证器或自定义日期类型实现,以下是两种可行方案:
方案一:使用Pydantic字段验证器
通过@field_validator(Pydantic v2版本,v1版本用@validator)对输入的日期字符串进行格式校验与转换:
from pydantic import BaseModel, field_validator from datetime import date class Profile(BaseModel): name: str DOB: date gender: str @field_validator("DOB", mode="before") def parse_dob(cls, value): # 仅接受DD-Mon-YYYY格式的字符串,例如15-Jul-1996 if isinstance(value, str): try: return date.strptime(value, "%d-%b-%Y") except ValueError: raise ValueError("日期格式必须为DD-Mon-YYYY,例如15-Jul-1996") return value
说明:
mode="before"表示在Pydantic自动解析前处理输入值,确保先校验格式再转换为date类型。%d对应两位数字日期,%b对应英文月份缩写(如Jan、Jul),%Y对应四位数字年份,完全匹配目标格式。- 输入格式不符时会抛出
ValueError,FastAPI自动返回422验证错误响应。
方案二:自定义可复用的日期类型
若多个模型需使用同一格式日期,可自定义继承自date的类型,复用校验逻辑:
from pydantic import BaseModel, GetCoreSchemaHandler from pydantic_core import core_schema from datetime import date class DateDDMonYYYY(date): @classmethod def __get_pydantic_core_schema__(cls, source_type, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: return core_schema.no_info_wrap_validator_function( cls.validate, core_schema.str_schema(), ) @classmethod def validate(cls, value: str) -> date: try: return cls.strptime(value, "%d-%b-%Y") except ValueError: raise ValueError("日期格式必须为DD-Mon-YYYY,例如15-Jul-1996") class Profile(BaseModel): name: str DOB: DateDDMonYYYY gender: str
说明:
- 自定义类型
DateDDMonYYYY封装了格式校验逻辑,后续其他模型直接使用该类型即可,无需重复编写验证器。 - 通过
__get_pydantic_core_schema__方法告知Pydantic如何解析和校验该类型输入。
如果需要接口输出时也保持15-Jul-1996格式,可添加序列化逻辑:
from pydantic import model_serializer class Profile(BaseModel): name: str DOB: date gender: str # ... 验证器代码 ... @model_serializer def serialize_model(self): return { "name": self.name, "DOB": self.DOB.strftime("%d-%b-%Y"), "gender": self.gender }
内容的提问来源于stack exchange,提问作者link
相关产品推荐
相关产品推荐

