Bạn có thể làm hai truy vấn, một cho người dùng trước khi người sử dụng hiện tại, và một cho người dùng chỉ sau:
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]
Đây là căn cứ trên hai truy vấn:
- Tất cả người dùng với điểm số lớn hơn người dùng hiện tại hoặc có cùng số điểm nhưng với điểm số thấp hơn
pk
.
- Tất cả người dùng có điểm số thấp hơn người dùng hiện tại hoặc có cùng số điểm nhưng với số điểm cao hơn
pk
.
Sau đó, với thứ tự và giới hạn thích hợp, bạn có thể nhận được kết quả của mình. Tất nhiên pk
có thể được thay thế bằng bất kỳ ứng dụng nào khác, hoặc chỉ được xóa hoàn toàn. Trong trường hợp sau, bạn thay vì có thể xem xét mà người dùng hiện tại luôn là đầu tiên (đây chỉ là một ví dụ), và các truy vấn trở thành:
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]
Ngoài ra, để có được chỉ là chỉ số của người dùng hiện trong danh sách của người sử dụng sắp xếp theo điểm, bạn có thể làm:
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()
Sau đó, danh sách người dùng tập trung vào hiện tại sẽ chỉ là:
User.objects.all().order_by('-profile__points', 'pk')[index - 5:index + 6]
thay thế này có thể chậm hơn nếu bạn có nhiều người dùng, vì toàn bộ danh sách người dùng trước khi người dùng hiện tại cần được đánh giá, nhưng tôi đã không xác minh điều này.
Điều đó sẽ làm việc. bất kỳ ý tưởng làm thế nào tôi có thể nhận được "vị trí" của người dùng theo thứ tự đó? –
@ Nuno_147 Bạn có thể đếm số lượng người dùng trước một người hiện tại, tôi đã hoàn thành câu trả lời của mình với giải pháp thay thế này. –
Q (profile__points__gt = point) | Q (profile__points = points) có thể được thay đổi thành Q (profile__points_gte = point) phải không? –