2013-08-01 2 views
4

메신저 결과를 캐싱하고 오는 쿼리에서 사용하여 관리자로부터 dbase 쿼리를 최적화하려고합니다. 하지만 - 난 여전히 각 항목에 대한 dbase 요청을 참조하십시오.쿼리 캐쉬를 사용하여 django 관리자를 최적화하는 방법

내가이 같은 모델이 다음과 같이

user action company_name 

그래서 난 내 관리자 정의 : 관리자 change_list에서

class actions(models.Model): 
    user = models.ForeignKey(MyUser) 
    action = ... 

class Myuser(Models.Model): 
    name = models.CharField() 
    company = models.ForeignKey(Companies) 

을, 내가있는 테이블을보고 싶어요

class ActionsAdmin(admin.ModelAdmin): 
    list_display = ('user','action','company_name') 
    ... 

def company_name(self,instance): 
    return instance.user.company 

나는 이것을 실행할 때 각 사용자마다 회사 이름을 추출하는 쿼리가 회사 모델에 있음을 알 수 있습니다. 그러나 많은 회사가 없기 때문에 많은 경우 사용자가 여러 번 많은 작업을 수행합니다. 모든 회사에 대해 한 번 쿼리 한 다음 각 항목에 대해 dbase에 액세스하는 대신 캐시 된 결과를 사용하려고합니다.

어떻게 할 수 있습니까?

답변

6

사용 list_select_related 귀하의 경우 있도록 쿼리 선택의 관계를 지정하려면 사용자 정의 메소드를 필요로하지 않고,

또한 list_display에서 직접 필드를 지정할 수 있습니다

class ActionsAdmin(admin.ModelAdmin): 
    list_display = ('user','action','company_name') 
    list_select_related = ('user__company',) 
    ... 

def company_name(self,instance): 
    return instance.user.company 

편집 .

적어도 (위에서 링크 된 문서에 따라) list_select_related을 처리해야합니다. Companies 모델에 name 필드가 있다고 가정하면 :

class ActionsAdmin(admin.ModelAdmin): 
    list_display = ('user','action','user__company__name') 
관련 문제