我的网站上的每个用户都有一个模型(UserProfile)每个配置文件都包含一个名为points的字段。
我希望在按点排序时从当前用户获得-5 + 5个用户。我怎么能做到这一点?
答案 0 :(得分: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]
如果你有很多用户,这个替代方案可能会更慢,因为需要评估当前用户之前的整个用户列表,但我没有验证这一点。
答案 1 :(得分: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]