Суммарные значения Джанго за последние 10 недель для каждой недели - PullRequest
0 голосов
/ 27 сентября 2018

Учитывая дату, как вы можете суммировать итоги недели, в которую попадает эта дата, и каждой из 10 предыдущих недель?

Для каждого дня за последние 30 это может быть выполнено следующим образом:

import datetime as dt
from django.db.models import Sum

last_30 = dt.date.today() - dt.timedelta(days=30)
order_data = Order.objects.filter(
    date__gt=last_30).extra(
    select={'day': 'date(date)'}.values('day').annotate(
    total=Sum('total')
)

print(order_data)

<OrderQuerySet [{'day': datetime.date(2018, 8, 28), 'total': Decimal('50000.00'), 
                {'day': datetime.date(2018, 8, 29), 'total': Decimal('84000.00'), 
                '...(remaining elements truncated)...']>

Я полагаю, что их можно как-то сгруппировать по неделям после факта, просматривая order_data, но мне было интересно, есть ли другой способ.

Использование postgresql, если это имеет значение.

1 Ответ

0 голосов
/ 27 сентября 2018

Вы можете использовать Django's ExtractWeek [Django-doc] , чтобы получить номер недели для даты.Таким образом, мы можем сначала аннотировать набор запросов, а затем передать правильные значения, например:

from django.db.models.functions import ExtractWeek

qs = Order.objects.filter(date__gt=last_70).annotate(
    week=ExtractWeek('date')
).values('week').annotate(
    week_total=Sum('total')
).order_by('week')

Это приведет к чему-то вроде:

<QuerySet [
    { 'week': 14, 'week_total': 1425.0 }
    { 'week': 15, 'week_total': 1302.0 }
    { 'week': 17, 'week_total': 1993.0 }
]>

Обратите внимание, что

  1. значение .order_by важно, так как в противном случае значения будут не"сгибаться";
  2. , если для определенной недели нет строк, они будут не быть в наборе запросов, поэтому может потребоваться некоторая постобработка, чтобы ввести для этого нули;
  3. как для исходного кода , в качестве первого дня используется Monday недели;
  4. , поскольку вы фильтруете набор данных, самая ранняя неделя будет суммироваться только за подмножество этой недели (дни, которые не являются "слишком старыми""), таким образом, это приведет к тому, что эта сумма не будет совпадать со всеми днями этой недели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...