Django中从查询集获取格式化最大最小日期并解决JSON序列化问题
Django 聚合日期返回JSON序列化报错解决方法
报错原因
Django ORM 聚合查询返回的日期类型是Python原生date对象,JSON默认不支持该类型的序列化,因此直接返回会触发TypeError: Object of type 'date' is not JSON serializable错误。
解决方案
以下三种方案可按需选择:
方案1:查询阶段直接将日期转为字符串(推荐)
通过Django内置的Cast函数在数据库查询阶段直接将日期转为字符串,无需后续二次处理,兼容性强。
from django.db.models import Min, Max, CharField from django.db.models.functions import Cast sess = Session.objects.last() max_min_dates = sess.camp.aggregate( min_start_date=Cast(Min('start_date'), output_field=CharField()), max_end_date=Cast(Max('end_date'), output_field=CharField()) )
查询结果的两个值默认是YYYY-MM-DD格式的字符串,可直接序列化返回。
方案2:查询后手动格式化日期
适合需要自定义日期格式的场景,注意加空值判断避免没有关联camp时报错。
from django.db.models import Min, Max sess = Session.objects.last() max_min_dates = sess.camp.aggregate(Min('start_date'), Max('end_date')) formatted_result = { "min_start_date": max_min_dates["start_date__min"].strftime("%Y-%m-%d") if max_min_dates["start_date__min"] else None, "max_end_date": max_min_dates["end_date__max"].strftime("%Y-%m-%d") if max_min_dates["end_date__max"] else None }
可根据需求调整strftime的格式参数,比如%Y/%m/%d或者带时分秒的格式。
方案3:使用DRF序列化器自动转换
如果项目使用Django REST Framework,直接通过序列化器的DateField自动处理日期序列化即可。
首先定义序列化器:
from rest_framework import serializers class DateRangeSerializer(serializers.Serializer): start_date__min = serializers.DateField(allow_null=True) end_date__max = serializers.DateField(allow_null=True)
查询后调用序列化器:
from django.db.models import Min, Max sess = Session.objects.last() max_min_dates = sess.camp.aggregate(Min('start_date'), Max('end_date')) serializer = DateRangeSerializer(max_min_dates) # 直接返回serializer.data即可,已经是可序列化的标准格式
注意事项
如果当前session没有关联任何camp,聚合查询返回的两个日期值均为None,所有方案都需要做好空值兼容处理,避免调用属性/方法时报错。
内容的提问来源于stack exchange,提问作者user001
相关产品推荐
相关产品推荐

