如何用Python获取本周各日期?适配Django的datetime.date格式
解决方案:Django实现本周商品销量统计
1. 获取本周所有日期(datetime.date格式)
先确定本周的日期范围,以下示例以周日作为一周起始,若需以周一为起始,调整计算逻辑即可:
from datetime import date, timedelta def get_week_dates(): today = date.today() # 计算本周日的日期(当天是周日则直接取当天) sunday = today - timedelta(days=today.weekday() + 1) # 生成本周7天的日期列表:周日到周六 week_dates = [sunday + timedelta(days=i) for i in range(7)] return week_dates
注:weekday()返回值为0=周一、6=周日,通过today.weekday() +1计算出距离上一个周日的天数,反向推导得到本周起始日。
2. 统计每日商品销量
假设你的订单模型为Order,包含created_at(下单日期,支持datetime.date或datetime.datetime类型)和quantity(单订单商品数量)字段,可按以下方式统计:
基础循环查询(适合小数据量)
from django.db.models import Sum from .models import Order def get_daily_sales(week_dates): daily_sales = [] for day in week_dates: # 过滤当天订单并求和,无销量则返回0 if hasattr(Order.created_at, 'date'): # 若created_at是datetime.datetime类型,需用__date过滤 total = Order.objects.filter(created_at__date=day).aggregate(total=Sum('quantity'))['total'] or 0 else: total = Order.objects.filter(created_at=day).aggregate(total=Sum('quantity'))['total'] or 0 # 转换为中文星期名称 weekday_name = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"][day.weekday()] daily_sales.append({ 'date': day, 'weekday': weekday_name, 'sales': total }) # 若需按你示例的顺序(周日优先,再倒序其余日期),可添加排序逻辑 # sorted_sales = [item for item in daily_sales if item['weekday'] == '周日'] + \ # sorted([item for item in daily_sales if item['weekday'] != '周日'], key=lambda x: x['date'], reverse=True) return daily_sales
优化批量查询(大数据量推荐)
上面的循环会执行7次SQL查询,用TruncDate和annotate可实现1次批量统计,提升性能:
from django.db.models import Sum from django.db.models.functions import TruncDate from .models import Order def get_daily_sales_optimized(): today = date.today() sunday = today - timedelta(days=today.weekday() + 1) saturday = sunday + timedelta(days=6) # 批量统计本周每日销量 sales_data = Order.objects.filter( created_at__date__range=[sunday, saturday] ).annotate( sale_date=TruncDate('created_at') ).values('sale_date').annotate( total_sales=Sum('quantity') ).values('sale_date', 'total_sales') # 转换为字典,方便匹配日期 sales_dict = {item['sale_date']: item['total_sales'] for item in sales_data} # 补全所有日期的销量数据,无销量则填0 week_dates = [sunday + timedelta(days=i) for i in range(7)] daily_sales = [] for day in week_dates: weekday_name = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"][day.weekday()] daily_sales.append({ 'date': day, 'weekday': weekday_name, 'sales': sales_dict.get(day, 0) }) return daily_sales
3. 视图与模板展示
在视图中整合逻辑,将数据传递到模板:
def weekly_sales(request): week_dates = get_week_dates() daily_sales = get_daily_sales(week_dates) # 或用get_daily_sales_optimized() total_sales = sum(item['sales'] for item in daily_sales) return render(request, 'weekly_sales.html', { 'daily_sales': daily_sales, 'total_sales': total_sales })
模板weekly_sales.html展示示例:
{% for sale in daily_sales %} <p>{{ sale.weekday }} - 售出{{ sale.sales }}件商品</p> {% endfor %} <p>总计:售出{{ total_sales }}件商品</p>
内容的提问来源于stack exchange,提问作者TheAspectDev
相关产品推荐
相关产品推荐

