Django根据外键对字段求和

时间:2013-08-13 00:49:29

标签: django django-models django-views

所以这是我的模特:

class Puzzles(models.Model):
    user = models.ForeignKey(User)
    puzzle = models.CharField(max_length=200)


class Scores(models.Model):
   user = models.ForeignKey(User)
   puzzle = models.ForeignKey(Puzzles)
   score = models.IntegerField(default=0)

因此用户将获得多个分数。对于排行榜页面,我想输出具有最高总分的用户(从所有不同分数中添加)。我真的迷失了python代码的功能。

任何帮助表示赞赏, 谢谢!

3 个答案:

答案 0 :(得分:4)

最简单的方法是使用注释。

from django.db.models import Sum

best = User.objects.annotate(total_score=Sum('scores__score')).order_by('-total_score')[0:10]

文档中有一个example非常重要。

答案 1 :(得分:0)

这是所有谜题的排行榜页面还是只有一个?如果可以的话,你可以尝试类似的东西:

Score.objects.all().order_by('score')[:10] # limit 10

答案 2 :(得分:0)

我认为最好的方法是使用totalscore字段创建用户个人资料模型。然后,您可以使用与保存分数模型相关联的信号来更新totalscore字段。有关使用信号的帮助,请参见下文。

django how do i send a post_save signal when updating a user? https://docs.djangoproject.com/en/dev/ref/signals/

然后,您只需执行UserProfile.objects.all().order_by('totalscore')

即可

编辑:以下是有关用户个人资料的一些信息。它们应与用户一对一,然后可以包含您喜欢的任何自定义字段。 Django user profile

相关问题