2016-03-05 97 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