Django查询指定日期范围内每日售出商品总金额与销量的实现方法
Django 订单按日统计实现方案
推荐方案:使用Django ORM自带聚合能力实现(效率最优)
你无需手动遍历所有订单计算,直接通过ORM的日期截断+分组聚合能力即可直接得到按日统计的结果,步骤如下:
- 首先导入需要的工具类
from django.db.models import Sum from django.db.models.functions import TruncDate
- 替换原有查询和统计逻辑
# 过滤指定时间范围内的订单,按日期分组统计 daily_order_stats = models.Order.objects.filter( purchasedate__range=[from_date, to_date] ).annotate( # 将datetime类型的购买时间截断为日期格式 date = TruncDate("purchasedate") ).values("date").annotate( # 按日期聚合当日总销量、总销售额 count = Sum("quantity"), total_price_sold = Sum("price") ).order_by("date") # 如需统一格式(比如金额保留两位小数、日期转字符串)可以额外处理 formatted_stats = [] for item in daily_order_stats: formatted_stats.append({ "date": item["date"].strftime("%Y-%m-%d"), "count": int(item["count"]), "total_price_sold": float("%.2f" % item["total_price_sold"]) }) # 返回响应 return response.Response({ "from_date": from_date, "to_date": to_date, "daily_stats": formatted_stats })
返回结果示例:
{ "from_date": "2021-11-19", "to_date": "2021-11-23", "daily_stats": [ { "date": "2021-11-19", "count": 2, "total_price_sold": 5000.00 }, { "date": "2021-11-20", "count": 4, "total_price_sold": 12000.00 } ] }
可选扩展:补全时间范围内无订单的日期
如果你需要时间范围内所有日期都返回,哪怕当日没有订单也返回count=0、total_price_sold=0,可新增日期补全逻辑:
from datetime import timedelta # 生成起始到结束的所有日期列表 all_dates = [] current_date = from_date while current_date <= to_date: all_dates.append(current_date) current_date += timedelta(days=1) # 将统计结果转成字典方便匹配 stats_dict = {item["date"]: item for item in daily_order_stats} # 补全所有日期 formatted_stats = [] for d in all_dates: stat = stats_dict.get(d, {"count": 0, "total_price_sold": 0}) formatted_stats.append({ "date": d.strftime("%Y-%m-%d"), "count": int(stat["count"]), "total_price_sold": float("%.2f" % stat["total_price_sold"]) })
内容的提问来源于stack exchange,提问作者RAGHUL R
相关产品推荐
相关产品推荐

