2013-04-21 34 views
5

我有我的网站上的每个用户(UserProfile)的模型,每个配置文件都包含一个名为points的字段。使用Django的排行榜实现

我想从当前用户中获得-5 +5个用户,同时按点排序。我怎样才能做到这一点?

回答

3

你可以做两个查询,一个当前用户之前的用户,一个用于用户刚过:

  • 所有用户提供:对两个查询

    id = current_user.pk 
    points = current_user.profile.points 
    
    before = User.objects.filter(
        Q(profile__points__gt=points) | 
        Q(profile__points=points, pk__lt=id) 
    ).order_by('-profile__points')[:5] 
    
    after = User.objects.filter(
        Q(profile__points__lt=points) | 
        Q(profile__points=points, pk__gt=id) 
    ).order_by('profile__points')[:5] 
    

    这是基地比当前用户更高的分数,或者得分相同,但分数更低的pk

  • 所有用户评分低于当前用户,或者得分相同,但评分更高的为pk

然后按照正确的顺序和限制,您可以得到您的结果。当然pk可以被任何其他提交,或者完全删除。在后一种情况下,可以改为考虑当前用户永远是第一位(这只是一个例子),和查询都变成:

before = User.objects.filter(
    profile__points__gt=points, 
).order_by('-profile__points')[:5] 

after = User.objects.filter(
    profile__points__lte=points, 
).exclude(pk=id).order_by('profile__points')[:5] 

另外,获得当前用户的仅仅是索引列表由点分类的用户,你可以这样做:

id = current_user.pk 
points = current_user.profile.points 
index = User.objects.filter(
    Q(profile__points__gt=points) | 
    Q(profile__points=points, pk__lt=id) 
).count() 

那么你的用户列表集中在当前的也只是:

User.objects.all().order_by('-profile__points', 'pk')[index - 5:index + 6] 

这种替代可能是,如果你慢有很多用户,因为当前用户需要评估之前的整个用户列表,但我没有验证这一点。

+0

这应该工作。任何想法如何获得用户的“位置”按顺序? – 2013-04-21 20:28:53

+0

@ Nuno_147你可以计算当前用户的数量,我用这个选择完成了我的答案。 – 2013-04-21 23:35:48

+0

Q(profile__points__gt = point)| Q(profile__points = points)可以改为Q(profile__points_gte = point)对不对? – 2013-04-22 09:00:49

1

我不能确定你的观点是什么,但是这应该只是标注,类似下面...

from django.db.models import Sum, Avg 

UserProfile.objects.annotate(sum_rating=Sum('sum__points')).order_by('-sum_points') 

不要忘记你可以使用注释变量的过滤器。

更新:由点 公正的秩序,注意-

UserProfile.objects.filter(whatever here).order_by('-points')[:5] 

.order_by('points')[:5] 
+0

对不起,我没有说,但我不需要注释,因为我的点是计算allready和原始点。这里面临的挑战是如何获得某些用户积分的+5-5。我想要他在排行榜中的位置,还有他之前的5分和他之后的5分。 – 2013-04-21 20:27:23

+0

然后按点过滤和排序。然后你可以获得这些结果的前五名。最后五个按降序排列。 – 2013-04-21 20:37:43

+0

我的问题来自特定用户而非顶级用户。我需要找到用户的顺序,并获得+5 -5。 – 2013-04-21 20:49:25