计算特定年份每月销售的Widgets总值

0 投票
2 回答
520 浏览
提问于 2025-04-16 18:50

如果我有一个Django模型,定义了一个小部件(Widget),像这样:

class Widget(models.Model):
    type = models.CharField()
    sold = models.DateTimeField()
    price = models.DecimalField()
    .
    .

我该如何获取某一年每个月售出的小部件的总价值呢?

我想得到一个包含12个月总销售额的列表,比如:

[1225, 197, 131, 125, ...

这将显示一月份售出的小部件总价值是1225美元,二月份是197美元等等。

我觉得这可以通过Django的查询来实现,但我不太确定具体怎么做。

更新

我希望不使用任何特定于数据库的东西,这样更换数据库时会更方便。如果不是在一个查询中完成也没关系。先做一个查询,然后用Python进行一些处理也是可以的。

更新

我觉得我可以稍微修改一下我之前提问的答案中的一些代码来实现这个:

queryset = Widget.objects.filter(sold__year=year)
totals = [0] * 12
for widget in queryset:
    totals[widget.sold.month - 1] += widget.price
return totals

如果我遗漏了什么,或者有没有更好的方法,请告诉我。

2 个回答

0

这个方法和之前的类似,不过可能效率也不是很好。

month_totals = []
for month in range(1, 13):
    month_total = Widget.objects. \
               filter(sold__gte=datetime.date(the_year, month, 1),
                      sold__lte=datetime.date(the_year, month, 31)). \
               aggregate(month_total=Sum('price')).month_total
    month_totals.append(month_total)
0

根据 这个回答,你可以这样做。

Widget.objects.extra(select={'year': "EXTRACT(year FROM sold)", 'month': "EXTRACT(month from sold)"}).values('year', 'month').annotate(Sum('price'))

这样会给你类似这样的结果

[{'price__sum': 1111, 'year': 2010L, 'month': 6L}...]

编辑 - 不使用 EXTRACT

可能效率不是很高,但是……

for date in Widget.objects.all().dates('sold','month'):
    values["%s_%s" % (date.year,date.month)] = Widget.objects.filter(sold__month=date.month,sold__year=date.year).aggregate(Sum('price'))

撰写回答