我有一个这样的模型:
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有一个很好的解决方案。
答案 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)
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]