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

在Django REST Framework中将日期以dd-mm-yyyy格式存入数据库

解决方案

首先需要明确:数据库的DateField存储的是日期对象而非字符串格式,你所说的“存入数据库时改为dd-mm-YYYY格式”,实际是指序列化输出(返回给前端)时使用该格式,同时保持输入的YYYY-MM-DD格式不变。

以下是具体实现步骤:

1. 修正Django配置(全局生效)

你的settings.py中DATE_FORMAT配置存在两个问题:

  • 格式值应为字符串而非列表
  • %M代表月份全称(如October),要表示数字月份需用%m

修改后的配置如下:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'common.exception.custom_exception_handler.custom_exception_handler',
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    'NON_FIELD_ERRORS_KEY': "detail",
    'DATE_FORMAT': "%d-%m-%Y",  # 输出格式为dd-mm-YYYY
    'DATE_INPUT_FORMATS': ["%Y-%m-%d"]  # 指定接受的输入格式为YYYY-MM-DD
}

这样全局所有DateField都会自动处理输入输出格式,无需修改Serializer。

2. 单独配置Serializer(局部生效)

如果不想修改全局配置,可直接在Serializer的字段上指定输入输出格式:

class StudentSerializer(serializers.Serializer):
    start_date = serializers.DateField(
        input_formats=["%Y-%m-%d"],  # 接受YYYY-MM-DD格式的输入
        format="%d-%m-%Y"  # 输出为dd-mm-YYYY格式
    )
    end_date = serializers.DateField(
        input_formats=["%Y-%m-%d"],
        format="%d-%m-%Y"
    )

关键说明

  • 输入阶段:DRF会自动将请求中的YYYY-MM-DD字符串转换为Pythondate对象,存入数据库的是标准日期类型,不存在字符串格式问题
  • 输出阶段:通过format配置将date对象序列化为dd-mm-YYYY格式的字符串返回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:55:16