Django ORM - Как упорядочить объекты по сумме трех высших баллов? - PullRequest
0 голосов
/ 15 апреля 2020

Предположим, мои Django пользователи участвуют в различных конкурсах, где они набирают очки. Каждый пользователь имеет около 100 различных конкурсов, в которых он участвовал. Как я могу запросить модель пользователей в представлении, чтобы получить список пользователей, упорядоченный по сумме их баллов за соревнование трех высот? Поскольку я хочу передать определенные фильтры от представления к конкурсу (страна, год), я стараюсь не писать необработанные SQL.

contest_sum = (Contest.objects.filter(user=OuterRef('id'))
      .order_by('-points')
      .values('user')
      .annotate(total=Sum('points'))
      .values('total')
    )
User.objects.annotate(sum=Subquery(contest_sum)).order_by('-sum')

Вышеприведенный результат по сути является результатом, которого я ищу, однако я хочу ограничить сумму тремя первыми конкурсами, а не суммой по всем конкурсам.

Редактировать ---- ----------------------------------

Используя Django Windows, у меня есть был в состоянии добавить рейтинг к объектам конкурса на основе пользователей. Однако Django запрещает фильтрацию после оконной функции, что затрудняет вычисление суммы на основе ранга.

Contest.objects.annotate(
    rank=Window(expression=Rank(), 
    partition_by=F('user_id'), 
    order_by=F('points').desc())
)
...