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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:42:02