Django ORM, суммирование значений столбцов через запрос

У меня есть таблица со следующими значениями:

user сумма дата
Джон 10 2017-07-01
Джон 20 2019-07-01
Джон 30 2020-09-01
Джон 40 2021-11-01
... ... ...
Dan -20 2019-02-01
Dan -30 2020-04-01
Dan -40 2021-06-01

Входом функции является диапазон даты, например, следующим образом:

date_start = '2019-01-01'
date_end = '2021-11-07'

Ожидаемый результат:

Для всех пользователей, для каждой даты в этом диапазоне дат, я хочу вернуть sum из amounts, от текущей даты до всех предыдущих дат, как это:

user сумма дата
Джон 30 (10+20) 2019-07-01
Джон 60 (10+20+30) 2020-09-01
Джон 100 (10+20+30+40) 2021-11-01
... ... ...
Dan -20 2019-02-01
Дан -50 (-20-30) 2020-04-01
Дан -90 (-20-30-40) 2021-06-01

Мои усилия

def get_sum_amount(self, date_start=None, date_end=None):
    date_detail = {}
    # Minimum date
    if date_start:
        date_detail['date__gt'] = date_start

    # Maximum date
    if date_end:
        date_detail['date__lt'] = date_end

    detail = Financial.objects.filter(Q(**date_detail)) \
        .values('user') \
        .annotate(sum_amount=Coalesce(Sum(F('amount')), Value(0)))

но результата нет.

Вы можете использовать функции Window с разделом onuser для запуска кумулятивной суммы по каждому пользователю, упорядоченной по дате:

detail = Financial.objects.filter(**date_detail).annotate(
    running_amount=Window(
        expression=Sum('amount'),
        partition_by=[F('user')],
        order_by=F('date').asc(),
    )
)
Вернуться на верх