Получите общее количество за каждый месяц, используя Django - PullRequest
5 голосов
/ 08 мая 2011

У меня есть такая модель:

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 ​​на рельсах, насколько я помню, это было довольно просто, поэтому я 'Надеюсь, у Джанго хорошее решение.

Ответы [ 2 ]

6 голосов
/ 08 мая 2011

Обычно для чего-то подобного этот код должен работать.

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

Но у вас есть поле dateTime, а не только месяц для каждого элемента.Вы можете попробовать сделать следующее, хотя я сомневаюсь, что это сработает.

values_list('date_sold__month')

Другой вариант - попытаться использовать extra (), как показано в этой теме Поэтому вы можете попробовать что-то вроде этого, если вы используете MySql.

Sales.objects.filter(date_sold__year='2010').extra({'month' : "MONTH(date_sold)"}).values_list('month').annotate(total_item=Count('item'))
1 голос
/ 08 мая 2011

с использованием 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]
...