我正在尝试有效地对 QuerySet 进行排名(将其保留为 QuerySet 以便我可以保留 filter 和 order_by 函数),但似乎找不到任何其他方法来遍历 QuerySet 并增加排名。如果不需要,我不想为我的模型添加排名。
我知道如何通过 SQL 查询获得所需的值,但似乎无法将其转换为 Django:
SET @rank = 0, @prev_val = NULL;
SELECT rank, name, school, points FROM
(SELECT @rank := IF(@prev_val = points, @rank, @rank+1) AS rank, @prev_val := points, points, CONCAT(users.first_name, ' ', users.last_name) as name, school.name as school
FROM accounts_userprofile
JOIN schools_school school ON school_id = school.id
JOIN auth_user users ON user_id = users.id
ORDER BY points DESC) as profile
ORDER BY rank DESC
我发现,如果我确实遍历了 QuerySet 并手动添加了“排名”,然后进一步过滤了结果,我的“排名”就会消失 - 除非将它变成一个列表(这使得过滤和排序有点痛苦)。有没有其他方法可以为我的 QuerySet 添加排名?有什么办法可以进行上述查询并获得一个带有 filter 和 order_by 功能的 QuerySet 仍然完好无损?我目前正在使用带有 Django 的 jQuery DataTables 来生成带有分页的排行榜(这就是我需要保留过滤和 order_by 的原因)。
提前致谢!抱歉,如果我没有正确发布我的问题 - 任何帮助将不胜感激。