我有我的網站上的每個用戶(UserProfile)的模型,每個配置文件都包含一個名爲points的字段。使用Django的排行榜實現
我想從當前用戶中獲得-5 +5個用戶,同時按點排序。我怎樣才能做到這一點?
我有我的網站上的每個用戶(UserProfile)的模型,每個配置文件都包含一個名爲points的字段。使用Django的排行榜實現
我想從當前用戶中獲得-5 +5個用戶,同時按點排序。我怎樣才能做到這一點?
你可以做兩個查詢,一個當前用戶之前的用戶,一個用於用戶剛過:
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]
這種替代可能是,如果你慢有很多用戶,因爲當前用戶需要評估之前的整個用戶列表,但我沒有驗證這一點。
我不能確定你的觀點是什麼,但是這應該只是標註,類似下面...
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]
對不起,我沒有說,但我不需要註釋,因爲我的點是計算allready和原始點。這裏面臨的挑戰是如何獲得某些用戶積分的+5-5。我想要他在排行榜中的位置,還有他之前的5分和他之後的5分。 – 2013-04-21 20:27:23
然後按點過濾和排序。然後你可以獲得這些結果的前五名。最後五個按降序排列。 – 2013-04-21 20:37:43
我的問題來自特定用戶而非頂級用戶。我需要找到用戶的順序,並獲得+5 -5。 – 2013-04-21 20:49:25
這應該工作。任何想法如何獲得用戶的「位置」按順序? – 2013-04-21 20:28:53
@ Nuno_147你可以計算當前用戶的數量,我用這個選擇完成了我的答案。 – 2013-04-21 23:35:48
Q(profile__points__gt = point)| Q(profile__points = points)可以改爲Q(profile__points_gte = point)對不對? – 2013-04-22 09:00:49