2012-03-15 4 views
2

장고 관리 인터페이스에서 모델을 열려고하면 이러한 쿼리가 수천 번씩 발생하며 심각한 성능 문제가 발생합니다.Django 관리자 성능 문제

[sql] SELECT ... FROM `auth_user` WHERE `auth_user`.`id` = 9535 
[sql] (21ms) Found 1 matching rows 
[sql] SELECT ... FROM `auth_user` WHERE `auth_user`.`id` = 9536 
[sql] (20ms) Found 1 matching rows 

장고 관리자가 select_related()를 사용하지 않는 이유는 무엇입니까? 여기

(나는 관리자의 학생 모델의 인스턴스 찾고 있어요) (내가 생각하는) 모델의 관련 부분은 다음과 같습니다

from django.contrib.auth.models import User 

class Student(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    mhtl_user = models.OneToOneField(MHTLUser, unique=True) 
    def __str__(self): 
     return u"%s %s" % (self.user.first_name, self.user.last_name) 

class MHTLUser(models.Model): 
    user = models.OneToOneField(User, unique=True) 
    def __str__(self): 
     return str(self.user) 
+0

"mhtl_user = models.OneToOneField (MHTLUser, unique = True)"를 주석 처리하면 쿼리가 사라집니다. 그래서 그것은 어떻게 든 그와 관련이 있습니다 ... –

+0

Aaand MHTLUser의 __str__ 함수입니다. 문제가 해결되면 문제가 해결됩니다. 하지만 여전히 문제인지 궁금해합니다. –

+0

이 같은 SQL 쿼리를 표시하기 위해 무엇을 사용하고 있습니까? – Kedare

답변

3

또는 list_select_related을 사용하십시오.

class MyModelAdmin(admin.ModelAdmin): 
    list_select_related = True 
    # .... 
+0

나는 그것이 효과가 있다고 생각했기 때문에 원래이 대답을 받아 들였지만 실제로는 그것을 고쳐주는 또 다른 변화였다. MHTLUser의 __str__ 메서드에 주석을 달았습니다. 이 ModelAdmin을 사용하면 실제로이 경우 도움이되지 않습니다. –

+1

다음에 자신의 질문에 답하고 동의해야합니다. –

2

당신은 장고가 자신을 정의하여 select_related 사용하도록 할 수 ModelAdmin like

class MyModelAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.select_related()