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

如何将DRF中DateField默认格式从YYYY-MM-DD改为DD-MM-YYYY?

解决DRF中DateField POST请求格式不生效的问题

我懂你的痛点——你已经在序列化器里给schedule_date指定了format="%d-%m-%Y",发现列表接口返回数据时日期确实变成了DD-MM-YYYY,但用POST提交这个格式的日期时,DRF却不买账,还是默认要求YYYY-MM-DD对吧?这是因为DRF的DateField参数分工很明确:

  • format:只负责序列化输出(把数据库里的日期转成指定格式返回给前端)
  • input_formats:才是控制反序列化输入(解析前端提交的日期字符串转成Date对象)的参数

解决方案1:单独给字段配置输入格式

直接修改你的ReminderSerializer,给schedule_date加上input_formats参数,明确告诉DRF可以接受DD-MM-YYYY格式的输入:

class ReminderSerializer(HyperlinkedModelSerializer):
    schedule_date = serializers.DateField(
        format="%d-%m-%Y",
        input_formats=["%d-%m-%Y", "%Y-%m-%d"]  # 可选保留默认格式做兼容
    )
    class Meta:
        model = Reminder
        fields = ('id','content','created_at','schedule_date','schedule_time','user_id','is_release','is_deleted',)

这样设置后,DRF在处理POST请求时,会先尝试用%d-%m-%Y解析日期,如果失败再尝试默认的%Y-%m-%d,既满足你的需求,也保留了兼容性。

解决方案2:全局配置所有DateField

如果你希望项目里所有的DateField都统一使用DD-MM-YYYY的输入输出格式,可以在项目的settings.py里添加DRF的全局配置:

REST_FRAMEWORK = {
    # 统一输出格式
    'DATE_FORMAT': '%d-%m-%Y',
    # 支持的输入格式列表
    'DATE_INPUT_FORMATS': ['%d-%m-%Y', '%Y-%m-%d']
}

这样就不用每个序列化器都单独设置字段了,全局生效更省心。

验证一下

修改完成后,你可以测试POST请求,提交schedule_date=31-12-2024这样的格式,DRF应该能正确解析并存储到数据库里,同时接口返回的日期也会保持DD-MM-YYYY格式。

内容的提问来源于stack exchange,提问作者Jackquin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:10:10