Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算特定年份每月售出的小部件的总价值_Python_Django - Fatal编程技术网

Python 计算特定年份每月售出的小部件的总价值

Python 计算特定年份每月售出的小部件的总价值,python,django,Python,Django,如果我有一个Django模型,它定义了这样一个小部件: class Widget(models.Model): type = models.CharField() sold = models.DateTimeField() price = models.DecimalField() . . 我将如何获得特定年份每月售出的小部件的总价值 最后,我想列出12个月的总数,例如: [1225, 197, 131, 125, ... 这将表明1月份出售的小部件的

如果我有一个Django模型,它定义了这样一个小部件:

class Widget(models.Model):
    type = models.CharField()
    sold = models.DateTimeField()
    price = models.DecimalField()
    .
    .
我将如何获得特定年份每月售出的小部件的总价值

最后,我想列出12个月的总数,例如:

[1225, 197, 131, 125, ...
这将表明1月份出售的小部件的总价值为1225美元,2月份为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
如果我错过了什么,或者有没有更好的方法,请告诉我。

基于您所能做的

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}...]
编辑-不使用提取

可能效率不高,但

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'))

类似的方法,但可能也不是很有效

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)

这个数据库是特定的吗?我不希望使用任何特定于数据库的方法来简化数据库的更改。我不介意它不是在一个查询中完成的。做一个查询,然后使用Python进行一些操作,如果可以的话。@gerty-很抱歉,是的,这是特定于数据库的。没问题。当我第一次提出这个问题时,我应该把这个要求说清楚。我添加了一个更新。谢谢