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

求助:Django修改日期格式无效,无法转为%d %b %Y格式

解决Django REST Framework日期格式显示问题

问题根源

  1. Django的DATE_FORMAT配置仅作用于模板渲染,DRF序列化器默认采用ISO标准格式(YYYY-mm-dd)处理日期字段,不受该配置影响。
  2. 模型中DateField的参数写错:auto_add_now是无效参数,正确写法为auto_now_add=True。
  3. POST视图中错误地将格式化后的字符串传给DateField,该字段实际需要接收date类型对象而非字符串。
  4. 视图代码存在语法错误:GET方法中models.DateModel.objects.all().data是错误调用,POST方法中误用data.data而非validated_data获取验证后的数据。

修复步骤

1. 修正模型代码

class DateModel(models.Model):
    date = models.DateField(auto_now_add=True, blank=False)  # 修正参数名
    desc = models.CharField(max_length=255)  # CharField必须指定max_length参数

2. 自定义日期序列化格式(二选一)

方式一:单个序列化器自定义字段

修改序列化器,为date字段添加格式化逻辑:

from rest_framework import serializers
from appname import models
from django.utils import dateformat
from django.conf import settings

class DateSerializer(serializers.ModelSerializer):
    date = serializers.SerializerMethodField()

    def get_date(self, obj):
        return dateformat.format(obj.date, settings.DATE_FORMAT)

    class Meta:
        model = models.DateModel
        fields = '__all__'
方式二:全局配置DRF日期格式

在settings.py中添加DRF全局配置,统一所有日期字段的序列化/反序列化格式:

REST_FRAMEWORK = {
    'DATE_FORMAT': '%d %b %Y',
    'DATE_INPUT_FORMATS': ['%d %b %Y', '%Y-%m-%d'],  # 支持多种输入格式兼容
}

配置后保持原有序列化器代码即可生效。

3. 修正视图代码

from rest_framework import views, Response
from appname import serializer
from appname import models

class DateView(views.APIView):
    serializer_class = serializer.DateSerializer
    
    def get(self, request):
        queryset = models.DateModel.objects.all()
        # 必须指定many=True处理多条数据
        return Response(serializer.DateSerializer(queryset, many=True).data, status=200)
    
    def post(self, request):
        data = serializer.DateSerializer(data=request.data)
        if data.is_valid():
            desc = data.validated_data['desc']
            # auto_now_add会自动设置当前日期,无需手动传入date参数
            model_instance = models.DateModel.objects.create(desc=desc)
            return Response("Posted!", status=200)
        # 返回具体错误信息便于调试
        return Response(data.errors, status=400)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:10:49