使用Django获取每月的总数

时间:2011-05-08 10:27:01

标签: django django-models django-queryset

我有一个这样的模型:

class Sales(models.Model):
    item = models.CharField(max_length=40)
    date_sold = models.DateTimeField()

我想提供一个特定年份每月销售总物品的条形图。我的图表软件需要一个如下所示的列表,其中每个数字是特定月份的总销售数量。

sales_by_month = [4, 6, 7, 3, 5. ...]  

我该怎么做?

我觉得我应该使用日期aggregate和/或annotate,但无法解决问题。

我正在使用SQLite,但计划去PostgreSQL。

我在另一个使用ruby on rails的项目中做到了这一点,就我记忆而言,它非常简单,所以我希望Django有一个很好的解决方案。

2 个答案:

答案 0 :(得分:6)

通常对于这样的事情,下面的代码应该有用。

Sales.objects.filter(date_sold__year='2010').values_list('month').annotate(total_item=Count('item'))

但是你有一个dateTime字段,而不仅仅是每个项目的月份。您可以尝试执行以下操作,但我怀疑它是否有效。

values_list('date_sold__month')

另一种选择是尝试使用此thread中所示的extra()。因此,如果您使用的是MySql,则可以尝试这样的操作。

Sales.objects.filter(date_sold__year='2010').extra({'month' : "MONTH(date_sold)"}).values_list('month').annotate(total_item=Count('item'))

答案 1 :(得分:1)

使用django-qsstats-magic

import qsstats

queryset = Sales.objects.filter(date_sold__year='2010')

stats = qsstats.QuerySetStats(queryset, 'date_sold')

start, end = date(2010, 1, 1), date(2011, 1, 1)
sales_by_month = stats.time_series(start, end, interval='months')

# sales_by_month is a list of 2-element tuples where the first element is
# a datetime object and the second is value

result = [r[1] for r in sales_by_month]