Отображение данных в таблице лидеров - 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]

Начиная с вы можете работать с .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>
Вернуться на верх