Django кумулятивная сумма в модели (sqlite)

Моя модель:

class transaction(models.Model):
    transactiondate = models.DateField()
    category = models.ForeignKey(category, on_delete=models.PROTECT, default=0)
    details = models.CharField(max_length=200, null=True)
    amount = models.DecimalField(decimal_places=2, max_digits=10)
    accountid = models.ForeignKey(account, on_delete=models.PROTECT)

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

def cumulativebalance():
        query = """SELECT id, transactiondate,
            SUM("amount") 
            OVER (ORDER BY transactiondate) AS "cumsum" 
            FROM "transactions_transaction"
            GROUP BY transactiondate 
            ORDER BY transactiondate ASC, "cumsum" ASC
            """
        return balance = transaction.objects.raw(query)

Это возвращает нужный мне результат. Мой вопрос в том, есть ли в Django способ включить это в мою модель вместо того, чтобы использовать это как необработанный SQL?

Что я пробовал

Я нашел предыдущий похожий вопрос и адаптировал ответ к своей модели:

test = transaction.objects.annotate(
            cumsum=Func(
                Sum('amount'), 
                template='%(expressions)s OVER (ORDER BY %(order_by)s)', 
                order_by="transactiondate"
            ) 
        ).values('transactiondate', 'cumsum').order_by('transactiondate', 'cumsum')

Но это дает мне ошибку: OperationalError at /transactions/ near "OVER": syntax error. Я не понимаю, о чем это мне говорит.

SQL, который был сгенерирован, показан в трассировке. Мое лучшее предположение заключается в том, что это должно быть PARTITION BY после OVER вместо ORDER BY, но я не знаю, как я могу изменить это из моего кода на python.

('SELECT "transactions_transaction"."transactiondate", '
 'CAST(CAST(SUM("transactions_transaction"."amount") AS NUMERIC) OVER (ORDER '
 'BY transactiondate) AS NUMERIC) AS "cumsum" FROM "transactions_transaction" '
 'GROUP BY "transactions_transaction"."id", '
 '"transactions_transaction"."transactiondate", '
 '"transactions_transaction"."category_id", '
 '"transactions_transaction"."details", "transactions_transaction"."amount", '
 '"transactions_transaction"."accountid_id" ORDER BY '
 '"transactions_transaction"."transactiondate" ASC, "cumsum" ASC')

Начиная с , можно работать с Window выражениями [Django-doc]:

from django.db.models import F, Sum, Window

transaction.objects.annotate(
    cumsum=Window(Sum('amount'), order_by=F('transactiondate').asc())
).order_by('transactiondate', 'cumsum')

Возникающие при этом объекты transaction будут иметь дополнительный атрибут .cumsum.


Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из transaction в Transaction.

Вернуться на верх