2010-03-09 36 views
1

這是一種在Django模型上更新非規格化字段的低效方法。該領域本質上是存儲玩家在排行榜上的位置,這是我們用於向給定玩家顯示「附近」玩家的系統的要求。我該如何將這個Django查詢循環改寫爲更高效的SQL查詢?

for position, player in enumerate(Player.objects.order_by('-score')): 
    player.position = position + 1 
    player.save() 

有沒有辦法在一個SQL查詢中執行此更新?我們使用的數據庫後端是MySQL。

謝謝你的時間!

回答

1

如果您想到Player.objects.order_by('-score')後面的SQL,它是SELECT player.* from player order by player.score desc。我不確定你想要做什麼,而沒有嵌套的MySQL查詢,技術上,這將是兩個查詢無論如何。

如果您重溫您的原始解決方案,那其實並不那麼複雜。

如果您的表現是您的問題,我建議您查看django-debug-toolbar如果您還沒有。這個小包提供了查詢的時間和統計信息。最新版本(0.8.3)還提供了一個CLI插件,向您顯示使用manage.py shell(稱爲debugsqlshell)執行的查詢。

+0

感謝您的時間,我認爲您是對的。 – rmh 2010-03-10 15:48:21

+0

不客氣。我很高興我可以幫忙! – jathanism 2010-03-10 16:03:01