2010-03-09 3 views
1

Player 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)은 manage.py shell (debugsqlshell)을 사용하여 수행 된 쿼리를 보여주는 CLI 플러그인도 제공합니다.

+0

시간 내 주셔서 감사합니다. 귀하가 옳다고 생각합니다. – rmh

+0

당신을 진심으로 환영합니다. 내가 도울 수있어서 기쁩니다! – jathanism

관련 문제