[英]What is most efficient way to get ranking in QuerySet?
我正在嘗試有效地對QuerySet進行排名(保持它為QuerySet以便我可以保留過濾器和order_by函數),但似乎無法找到任何其他方式然后迭代查詢集並增加排名。 如果我不需要,我不想在我的模型中添加等級。
我知道如何通過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並手動添加'rank'然后進一步過濾結果,我的'rank'將消失 - 除非將其轉換為列表(這使得過濾和排序有點痛苦)。 有沒有其他方法可以考慮添加我的QuerySet的排名? 有沒有辦法我可以做上面的查詢並獲得一個帶有過濾器和order_by函數的QuerySet仍然完好無損? 我目前正在使用帶有Django的jQuery DataTables來生成帶分頁的排行榜(這就是我需要保留過濾和order_by的原因)。
提前致謝! 對不起,如果我沒有正確發布我的問題 - 任何幫助將不勝感激。
我自己沒有使用它,但我很確定你可以用extra()方法做到這一點。
看看你的原始SQL我沒有看到你的邏輯有什么特別之處。 您只是枚舉由點計數的連接上的所有SQL行,計數器為1,同時將相同的點值折疊到相同的排名。
我的建議是編寫一個使用raw()或extra()方法的自定義管理器。 在您的經理中,您將在所有模型實例上使用python的枚舉作為先前按points
排序的等級。 當然,如果它們具有相同的點數,則必須保持點的當前最大值並覆蓋枚舉返回的值。 在這里看一下類似的例子。
然后你可以這樣做:
YourQuerySet.objects.with_rankings().all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.