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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:55:37