Django 模型:聚合多个外键字段值的总和
Django models: Aggregate Sum over multiple foreign key field values
我有以下 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'))
我有以下 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'))