Python Django注释在内存中返回结果

Python Django注释在内存中返回结果,python,sql,django,postgresql,orm,Python,Sql,Django,Postgresql,Orm,我在Django有以下电话: Activity.objects.values('user_field__username').annotate(Sum('reward')) 以下是我的“活动”表的模式: 用户(用户模型的外键) 奖赏 此表中每个用户可以有十几个条目。可能有1000万用户 我希望获得每个用户的总奖励,并一次性向所有此类用户发送通知。上面的查询满足了我的要求,但我被告知它是次优的,并且会有巨大的空间复杂性。原则上什么是正确的做法 我的活动模式: class Activity(m

我在Django有以下电话:

Activity.objects.values('user_field__username').annotate(Sum('reward'))
以下是我的“活动”表的模式:

  • 用户(用户模型的外键)
  • 奖赏
此表中每个用户可以有十几个条目。可能有1000万用户

我希望获得每个用户的总奖励,并一次性向所有此类用户发送通知。上面的查询满足了我的要求,但我被告知它是次优的,并且会有巨大的空间复杂性。原则上什么是正确的做法

我的活动模式:

class Activity(models.Model):
    user_field = models.ForeignKey(get_user_model(), default=0)
    reward = models.PositiveSmallIntegerField(default=0)

您最好以相反的方式进行查询,比如
User.objects.annotate(Sum('activity\uu reward'))
。您还将把用户提取到内存中。但是一千万可能会失败,因为Python不擅长处理100k+元素。如果你能在数据库级别进一步过滤总报酬,那么可以显著提高效率。你能解释一下在后台发生了什么吗@WillemVanonSem如果你能给我指一下你提到的反向调用的文档,那就太好了。我找不到它。默认情况下它将是
User.activity\u set
,除非您在活动中的外键上编码
相关的\u name
。它在Django文档中,在模型字段下键入ForeignKey。@JaiSharma annotations为queryset中的每个对象添加了一个属性,这样您就可以通过
User.objects.annotate(奖励=Sum('activity_u_奖励'))[0]访问奖励。奖励
您最好以相反的方式查询,比如
User.objects.annotate(Sum(“活动奖励”)
。你也会将用户放入内存。但是一千万可能会失败,因为Python不擅长处理100k+元素。如果你能在数据库级别进一步过滤总奖励,这可以显著提高效率。你能解释一下在@willemvanonsemb后台发生了什么吗e如果您能将文档指向您提到的反向调用,那就太好了。我找不到它。默认情况下,它将是
User.activity\u set
,除非您在活动中的ForeignKey上编码
related\u name
。它在Django文档中,在model fields type ForeignKey下,我想。@JaiSharma注释添加了一个属性添加到查询集中的每个对象,以便您可以通过
User.objects.annotate(奖励=Sum('activity\uu奖励'))[0]访问奖励。奖励