Рассчитать общую стоимость проданных виджетов каждый месяц за определенный год - PullRequest
0 голосов
/ 02 июня 2011

Если у меня есть модель Django, которая определяет виджет следующим образом:

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

Как мне узнать общую стоимость проданных виджетов в месяц за определенный год?

Я бы хотел получить список из 12 месячных итогов, например:

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

Это будет означать, что общая стоимость проданных виджетов в январе составила 1225 долларов, февраль 197 долларов и т. Д.

Я ожидаю, что это можно сделать с помощью Django Query, но не совсем уверен, как.

UPDATE

Я бы предпочел не использовать какую-либо конкретную базу данных, чтобы упростить изменение баз данных. Я не против, если это не все сделано в одном запросе. Выполнение запроса, а затем некоторые манипуляции с использованием Python после - это нормально.

UPDATE

Я думаю, что могу немного изменить код из ответа на другой вопрос, который я поднял, чтобы получить это:

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 голосов
/ 02 июня 2011

Аналогичный подход, но, вероятно, не очень эффективный

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 голосов
/ 02 июня 2011

на основе этот ответ вы могли бы сделать.

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}...]

Edit - без использования 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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...