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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 08:15:01