Отображение данных в таблице лидеров - Django
У меня следующая модель:
class UserDetail(models.Model):
donations = models.IntegerField(blank=True, null = True,)
points = models.IntegerField(blank=True, null = True,)
requests = models.IntegerField(blank=True, null=True)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
blank=True,
null=True,
)
Я хочу получить 5 пользователей с наибольшим количеством очков и отобразить их в HTML шаблоне таблицы лидеров.
Помогите пожалуйста
РЕДАКТИРОВАНИЕ:
МОЕ МНЕНИЕ:
def leaderboard(request,):
User.objects.alias(
total_points=Sum('userdetail__points')
).order_by('-total_points')[:5]
return render(request, 'leaderboard.html')
Вы можете работать с .annotate(…)
[Django-doc] и затем .order_by(…)
[Django-doc]:
from django.db.models import Sum
User.objects.annotate(
total_points=Sum('userdetail__points')
).order_by('-total_points')[:5]
Начиная с django-3.2 вы можете работать с .alias(…)
[Django-doc] для предотвращения вычисления этого как в качестве столбца, так и в ORDER BY
клаузе:
from django.db.models import Sum
User.objects.alias(
total_points=Sum('userdetail__points')
).order_by('-total_points')[:5]
Независимо от того, какой из двух вариантов вы выберете, вы передадите их в контекст в шаблоне:
def leaderboard(request,):
leaders = User.objects.alias(
total_points=Sum('userdetail__points')
).order_by('-total_points')[:5]
return render(request, 'leaderboard.html', {'leaders': leaders})
и в шаблоне вы можете отобразить лидерборд с помощью:
{% for leader in leaders %}
{{ leader.username }}
{% endfor %}}
Если вы хотите добавить точки рядом с именем пользователя, вам следует работать с вариантом .annotate(…)
. Затем вы можете отобразить это с помощью:
<table>
<th><td>User</td><td>Points</td></th>
{% for leader in leaders %}
<tr><td>{{ leader.username }}</td><td>{{ leader.total_points }}</td></tr>
{% endfor %}
</table>