【问题标题】:Django models: Aggregate Sum over multiple foreign key field valuesDjango模型:在多个外键字段值上聚合总和
【发布时间】:2016-03-05 19:15:07
【问题描述】:

我有以下 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 database sum aggregate annotate


【解决方案1】:

在django中,你可以试试:

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

【讨论】:

  • 我试过这个。虽然唯一的问题是这不会生成唯一的用户 pk 组,但这仍然很有用。所需要的只是总结等效的touples。我只是认为可能有更好的方法。例如:[{'target': 4, 'sum_pts': 1, 'author': 1}, {'target': 5, 'sum_pts': 4, 'author': 1}, {'target': 1, “sum_pts”:-3,“作者”:4},{“目标”:1,“sum_pts”:1,“作者”:5}]
  • @Jones 不生成用户 pk 的唯一元组是什么意思?
  • 会有 {1,2} 和 {2,1} touples
  • @Jones 是的,即使是普通的数据库查询也不会这样做,因为尽管它们引用了相同的模型,但它们是 2 个不同的字段。所以,我认为如果你想要你所要求的,迭代是唯一的选择
  • @Jones 没问题 :) 如果这是您想要的,我什至可以帮助您提供迭代解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2012-08-23
  • 2016-03-13
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多