这是更新Player
Django模型上的非规范化字段的低效方法。该字段基本上存储了玩家在排行榜上的位置,这是我们用于向给定玩家显示“附近”玩家的系统的要求。
for position, player in enumerate(Player.objects.order_by('-score')):
player.position = position + 1
player.save()
有没有办法在一个SQL查询中执行此更新?我们使用的数据库后端是MySQL。
谢谢你的时间!
答案 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
)执行的查询。