Предположим, мои 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())
)