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

Django中遍历未来7天订单的高效实现方案咨询

高效实现未来7天订单聚合统计

核心思路

避免每日重复执行数据库查询,改为单次查询+按日期分组聚合,大幅减少数据库交互次数,提升运行效率。

实现代码

先导入所需模块:

from django.db.models import Sum, TruncDate
from django.utils import timezone

执行查询与分组聚合:

# 计算日期范围:今日到未来第6天(含今日共7天)
today = timezone.now().date()
end_date = today + timezone.timedelta(days=6)

# 单次查询,按配送日期分组并聚合目标字段
daily_order_aggregates = Model.objects.filter(
    delivery_on__date__range=[today, end_date]
).annotate(
    delivery_date=TruncDate('delivery_on')  # 将datetime类型字段截断为日期
).values('delivery_date').annotate(
    field_1_sum=Sum('field_1'),
    field_2_sum=Sum('field_2'),
    field_3_sum=Sum('field_3'),
    field_4_sum=Sum('field_4'),
    field_5_sum=Sum('field_5')
).order_by('delivery_date')

整理为易使用的格式

将查询结果转换为以日期为键的字典,同时处理无订单日期的默认值:

# 生成未来7天的完整日期列表
date_list = [today + timezone.timedelta(days=i) for i in range(7)]

# 初始化每日统计数据(无订单时默认值为0)
daily_stats = {
    date: {
        'field_1_sum': 0,
        'field_2_sum': 0,
        'field_3_sum': 0,
        'field_4_sum': 0,
        'field_5_sum': 0,
    } for date in date_list
}

# 用查询结果覆盖有订单的日期数据
for item in daily_order_aggregates:
    daily_stats[item['delivery_date']] = item

# 存入context供模板调用
context['daily_orders'] = daily_stats

模板中使用示例

{% for date in daily_orders.keys %}
    <div class="daily-order">
        <h4>{{ date }}</h4>
        <p>字段1总和:{{ daily_orders.date.field_1_sum }}</p>
        <p>字段2总和:{{ daily_orders.date.field_2_sum }}</p>
        <!-- 其他字段依此类推 -->
    </div>
{% endfor %}

内容的提问来源于stack exchange,提问作者fkay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:15:41