Django ORM按月统计近一年数据:annotate与ExtractMonth用法详解

凌晨两点半
凌晨两点半
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何在Django中使用ORM框架按月统计近一年数据。核心步骤包括利用datetime和relativedelta计算一年前的时间点,筛选数据后通过annotate结合ExtractYear和ExtractMonth进行分组,最终使用Count统计每月数量。文章重点解析annotate与aggregate的区别,指出前者返回包含新字段的QuerySet,适合后续处理。

Django ORM按月统计近一年数据实现

具体实现代码如下所示:


# 计算时间
time = datetime.datetime.now() - relativedelta(years=1)
# 获取近一年数据
one_year_data = Data.objects.filter(create_time__gte=time_ago)
# 分组统计每个月的数据
count_res = one_year_data\
			.annotate(year=ExtractYear('create_time'),month=ExtractMonth('create_time'))\
      .values('year', 'month').order_by('year', 'month').annotate(count=Count('id'))
print(count_res)

执行上述代码后的打印结果如下:


<QuerySet [{'year': 2018, 'month': 7, 'count': 3}, {'year': 2019, 'month': 5, 'count': 7}, {'year': 2019, 'month': 6, 'count': 161}]>

annotate方法的核心作用与区别

关于annotate()方法的说明:

当需要对数据集先进行分组,再执行特定的聚合操作或排序时,必须使用annotate方法。与aggregate方法仅返回包含统计结果的字典不同,annotate方法返回的是包含新增统计字段的查询集(queryset)。

以上关于使用Django ORM框架按月统计近一年内数据的方法介绍完毕,希望能为读者提供有效的参考。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表