簡體   English   中英

什么是在QuerySet中獲得排名的最有效方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM