我的模型是:
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": 語法錯誤。我不明白這是在告訴我什么。
生成的 SQL 顯示在回溯中。我最好的猜測是它應該是 OVER 之后的 PARTITION BY 而不是 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')
uj5u.com熱心網友回復:
自從 django-2.0,可以使用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 撰寫的,因此您可能希望將模型從 重命名
為transactionTransaction。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415043.html
標籤:
上一篇:如何將整數串列轉換為單值元組
