求助:Django修改日期格式无效,无法转为%d %b %Y格式
解决Django REST Framework日期格式显示问题
问题根源
- Django的
DATE_FORMAT配置仅作用于模板渲染,DRF序列化器默认采用ISO标准格式(YYYY-mm-dd)处理日期字段,不受该配置影响。 - 模型中
DateField的参数写错:auto_add_now是无效参数,正确写法为auto_now_add=True。 - POST视图中错误地将格式化后的字符串传给
DateField,该字段实际需要接收date类型对象而非字符串。 - 视图代码存在语法错误: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
相关产品推荐
相关产品推荐

