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
相关产品推荐
相关产品推荐

