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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:25:13