我怎么能将这个Django查询循环重写为更有效的SQL查询?

时间:2010-03-09 23:20:07

标签: sql mysql django

这是更新Player Django模型上的非规范化字段的低效方法。该字段基本上存储了玩家在排行榜上的位置,这是我们用于向给定玩家显示“附近”玩家的系统的要求。

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

有没有办法在一个SQL查询中执行此更新?我们使用的数据库后端是MySQL。

谢谢你的时间!

1 个答案:

答案 0 :(得分: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)执行的查询。