Django遍历日期范围统计过去一年每日Order订单数量
Django 实现过去一年每日有效订单统计
首先修正你原有过滤代码的笔误:你代码中写的date__range对应的字段不存在,模型存储订单创建时间的字段为created_at,所以过滤时需要替换为created_at__range。
完整实现步骤如下:
1. 导入依赖模块
from django.db.models import Count from django.db.models.functions import TruncDate from django.utils import timezone from datetime import timedelta
2. 按天聚合统计订单量
使用TruncDate将 datetime 类型的created_at截断为日期类型,配合annotate和Count实现按天分组统计:
# 定义统计时间范围:过去52周(一年) end_time = timezone.now() start_time = end_time - timedelta(weeks=52) # 过滤有效订单 + 按天聚合统计 daily_counts = Order.objects.filter( ordered=True, variant__product=self, created_at__range=[start_time, end_time] ).annotate( # 按时区截断日期,避免时区偏移导致日期错误 date=TruncDate('created_at', tzinfo=timezone.get_current_timezone()) ).values('date').annotate( quantity=Count('id') ).order_by('date')
3. 补全无订单日期的统计值
上述聚合结果仅会返回存在订单的日期,为了覆盖过去一年所有日期、无订单时quantity为0,需要补全日期:
# 把聚合结果转为字典,提升查找效率 count_map = {item['date']: item['quantity'] for item in daily_counts} # 生成完整的日期序列并构造最终结果 result = [] current_date = start_time.date() end_date = end_time.date() while current_date <= end_date: result.append({ "date": current_date.strftime("%Y-%m-%d"), "quantity": count_map.get(current_date, 0) }) current_date += timedelta(days=1)
最终得到的result就是你要求的返回格式。
内容的提问来源于stack exchange,提问作者Damiisdandy
相关产品推荐
相关产品推荐

