Django 中对按月分组的 QuerySet 进行累计求和与前端图表数据准备

风宇吖_2256

风宇吖_2256

2026-07-04

397人浏览

原创

Django 中对按月分组的 QuerySet 进行累计求和与前端图表数据准备

本文讲解如何在 Django 中对按月份聚合的 QuerySet(如每月条目数)进行累计求和,并结构化输出为图表友好的格式,同时解决模板中数值拼接问题(如 251 → 25, 1)。

本文讲解如何在 django 中对按月份聚合的 queryset(如每月条目数)进行累计求和,并结构化输出为图表友好的格式,同时解决模板中数值拼接问题(如 `251` → `25, 1`)。

在 Django 开发中,常需将时间序列数据(如用户每日打卡记录)按月聚合统计,并进一步生成累计值或图表所需结构化数据。你当前使用的查询:

stats = EntryMonitoring.objects.filter(student_id=user).annotate(
    month=TruncMonth('date')
).values('month').annotate(total=Count('id'))

成功返回了类似 [{'month': date(2024,3,1), 'total': 25}, {'month': date(2024,4,1), 'total': 1}] 的 QuerySet。但直接在模板中 {% for obj in stats %}{{ obj.total }}{% endfor %} 会无分隔地拼接为 251,既无法用于图表渲染,也无法直观展示累计总量。

✅ 正确做法:后处理 QuerySet,注入累计值与标准化结构

Django 的 QuerySet 是惰性对象,不支持原地修改字典字段。因此,推荐在视图层将 QuerySet 转为列表后,逐项计算累计和,并添加新字段:

from django.db.models import Count
from django.db.models.functions import TruncMonth
from django.shortcuts import render
from datetime import datetime

def monthly_stats_view(request, user_id):
    # 获取用户 ID(实际中建议从 request.user 或 URL 参数获取)
    user = user_id  # 替换为实际用户对象或 ID

    # 执行聚合查询
    queryset = EntryMonitoring.objects.filter(student_id=user).annotate(
        month=TruncMonth('date')
    ).values('month').annotate(
        total=Count('id')
    ).order_by('month')  # 关键:确保按时间升序,累计才准确

    # 转为 list 并计算 cumulative_total
    stats = list(queryset)
    cumulative = 0
    for item in stats:
        cumulative += item['total']
        item['cumulative_total'] = cumulative
        # 可选:标准化日期为字符串,便于前端处理
        item['month_str'] = item['month'].strftime('%Y-%m')

    context = {
        'stats': stats,
        'grand_total': cumulative,  # 全部月份总和(如 26)
        # 图表所需扁平数组(推荐)
        'monthly_totals': [item['total'] for item in stats],
        'months': [item['month_str'] for item in stats],
    }
    return render(request, 'stats/monthly.html', context)

? 模板中正确使用(避免 251 问题)

在 monthly.html 中,切勿用 {% for obj in stats %}{{ obj.total }}{% endfor %} —— 这会丢失分隔符且无法绑定图表库。

前端美化
前端美化

使用此技能可创建独具特色、具备生产级质量的前端界面,设计品质高。当用户要求构建网页组件、页面、产物、海报或应用程序时(例如:网站、落地页、仪表盘、React 组件、HTML/CSS 布局,或对任意 Web UI 进行样式优化与视觉美化),请启用该能力。输出需为富有创意、精雕细琢的代码与 UI 设计,避免千篇一律的 AI 风格。

下载

✅ 推荐写法(适配 Chart.js 等):

<canvas id="monthlyChart"></canvas><script>
const ctx = document.getElementById('monthlyChart').getContext('2d');
new Chart(ctx, {
    type: 'bar',
    data: {
        labels: {{ months | safe }},
        datasets: [{
            label: '每月条目数',
            data: {{ monthly_totals | safe }},
            backgroundColor: 'rgba(54, 162, 235, 0.6)'
        }]
    }
});
</script>

⚠️ 注意事项:

  • order_by('month') 必须显式声明,否则累计顺序不可靠;
  • {{ months | safe }} 和 {{ monthly_totals | safe }} 需确保后端传入的是 JSON 可序列化的 Python 列表(Django 默认转义字符串,故需 |safe 或使用 json_script 标签更安全);
  • 若需「滚动累计」(如 3月=25,4月=25+1=26),cumulative_total 字段已满足;若需「当月独立值」,直接用 total;
  • 大数据量时,避免在 Python 层循环处理,可考虑数据库窗口函数(如 PostgreSQL 的 SUM() OVER (ORDER BY ...)),但跨数据库兼容性较低。

? 总结

核心要点有三:

  1. 聚合查询仅负责分组统计,累计逻辑应在视图层完成;
  2. 务必 order_by('month'),保障时间序列顺序;
  3. 模板中分离数据结构:用 monthly_totals 和 months 两个列表直接对接图表库,而非拼接原始字典。

这样既解决了 251 的显示错误,又为可视化提供了清晰、可扩展的数据接口。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2063

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4423

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5530

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

4998

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

703

5

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1571

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3704

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1569

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

21277

23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 9.6万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习