2016-03-05 140 views
2

我有以下Django的數據庫型號:Django模型:總金額在多個外鍵字段值

class Entry(models.Model): 
    author = models.ForeignKey(User); 
    target = models.ForeignKey(User); 
    points = models.IntegerField(default=0); 

用戶可以給其他用戶點。目標是計算每個用戶元組的點數總和。顯而易見的方法是使用迭代,但這會導致許多不必要的查詢。雖然這是一個相當簡單的SQL查詢,但我無法讓它與djangos API一起工作。我玩了annonate,聚合和Q過濾器,但無法達到預期的效果。

最好的結果會是這樣的:

[{'user_one_pk': 1, 'user_two_pk': 2, 'sum__points': 6}, 
{'user_one_pk': 1, 'user_two_pk': 3, 'sum__points': -3}, 
{'user_one_pk': 2, 'user_two_pk': 3, 'sum__points': 9}] 

編輯:澄清獨特的元組的編輯結果。

+0

最好的辦法是做它在數據庫中。寫一個簡單的函數,它是否 – Mox

回答

2

在Django,你可以嘗試:

from django.db.models import Sum 
Entry.objects.all().values('author','target').annotate('sum__points'=Sum('points')) 
+0

我試過這個。雖然唯一的問題是這不會產生用戶pks的獨特的缺點,但這仍然是有用的。所有需要的將是總結相同的缺陷。我只認爲可能有更好的辦法。例如:[{'target':4,'sum_pts':1,'author':1},{'target':5,'sum_pts':4,'author':1},{'target':1, 'sum_pts':-3,'author':4},{'target':1,'sum_pts':1,'author':5}] – Jones

+1

@Jones你的意思是不生成用戶pks的唯一元組? –

+0

將會有{1,2}和{2,1}元素 – Jones

相關問題