Джанго: проблема ежемесячной агрегации на протяжении более двенадцати месяцев - PullRequest
0 голосов
/ 14 июня 2019

Это моя модель:

class Purchase(models.Model):
    date           = models.DateField(default=datetime.date.today,blank=False, null=True)
    total_purchase = models.DecimalField(max_digits=10,decimal_places=2,blank=True, null=True)

Я хочу выполнить ежемесячную агрегацию поля total_purchase в приведенной выше модели.

Я попробовал следующее:

import datetime
import calendar
import collections
import dateutil
start_date = datetime.date(2018, 4, 1)
end_date = datetime.date(2019, 3, 31)
results = collections.OrderedDict()
result = Purchase.objects.filter(date__gte=start_date, date__lt=end_date).annotate(real_total = Case(When(Total_Purchase__isnull=True, then=0),default=F('Total_Purchase')))
date_cursor = start_date
z = 0
while date_cursor < end_date:
    month_partial_total = result.filter(date__month=date_cursor.month).aggregate(partial_total=Sum('real_total'))['partial_total']
    # results[date_cursor.month] = month_partial_total
    if month_partial_total == None:
        month_partial_total = int(0)
        e = month_partial_total
    else:
        e = month_partial_total

    z = z + e

    results[date_cursor.month] = z

    date_cursor += dateutil.relativedelta.relativedelta(months=1)

 return results

Но результат отображается только в течение двенадцати месяцев, если я выбираю диапазон дат для более чем двенадцати месяцев. Он рассчитывает общее количество за те же месяцы вместе.

** Например **

Я хочу выполнить следующее:

April      2800
May        2800
June       2800
July       2800
August     7800  #(2800 + 5000)
September  7800
October    13800 #(7800 + 6000)
November   13800
December   13800
january    14000   (13800+200)
february   14000
march      15000    (14000+1000)
April      18000   (15000+3000)
may        20000   (18000 + 2000)

Для месяцев, выбранных в два разных года.

Если я выберу месяцы, превышающие 12 месяцев, это произойдет так:

April      20800    (taking both the years Aprils together)
May        22800     (taking both the years Mays together)
June       2800
July       2800
August     7800  #(2800 + 5000)
September  7800
October    13800 #(7800 + 6000)
November   13800
December   13800
january    14000   (13800+200)
february   14000
march      15000    (14000+1000)

Пожалуйста, дайте любую альтернативу, чтобы правильно отфильтровать даты более 12 месяцев и отобразить их в виде списка.

...