2013-04-21 67 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