Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型:多个外键字段值的聚合和_Django_Database_Sum_Aggregate_Annotate - Fatal编程技术网

Django模型:多个外键字段值的聚合和

Django模型:多个外键字段值的聚合和,django,database,sum,aggregate,annotate,Django,Database,Sum,Aggregate,Annotate,我有以下Django数据库模型: class Entry(models.Model): author = models.ForeignKey(User); target = models.ForeignKey(User); points = models.IntegerField(default=0); 用户可以给其他用户打分。目标是计算 每个用户元组的点数之和。显而易见的方法是使用迭代,但这将导致许多不必要的查询。虽然这是一个相当简单的SQL查询,但我无法让它与

我有以下Django数据库模型:

class Entry(models.Model):
     author = models.ForeignKey(User);
     target = models.ForeignKey(User);
     points = models.IntegerField(default=0);
用户可以给其他用户打分。目标是计算 每个用户元组的点数之和。显而易见的方法是使用迭代,但这将导致许多不必要的查询。虽然这是一个相当简单的SQL查询,但我无法让它与djangos API一起工作。我使用了annonate、aggregate和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}]

编辑:编辑结果以澄清唯一元组。

在django中,您可以尝试:

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

最好的方法是在数据库中执行。写一个简单的函数,我试过了。虽然唯一的问题是,这将不会生成唯一的用户pks,但这仍然是有用的。所需要做的就是总结出这些等价的问题。我只是觉得可能有更好的办法。例如:[{'target':4,'sum_pts':1,'author':1},{'target':5,'sum_pts':4,'author':1,'sum_pts':1,'author':1},@Jones你说不生成用户pks的唯一元组是什么意思?将有{1,2}和{2,1}touples@Jones是的,即使是普通的数据库查询也不会这样做,因为虽然它们引用相同的模型,但它们是两个不同的字段。所以,我认为迭代是唯一的选择,如果你想要你所要求的for@Jones没问题:)如果你想要的话,我甚至可以帮你找到一个迭代的解决方案