2013-08-01 31 views
4

即時通過緩存結果並在未來查詢中使用,試圖優化管理員的dbase查詢。但是 - 我仍然看到每個條目的dbase請求。如何使用queryset高速緩存優化django Admin

我有這樣一個模型:在管理change_list

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

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

,我想看到一個表:

user action company_name 

,所以我定義我的管理如下:

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

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

當我運行這個,我看到,爲每個用戶,有一個查詢公司模型提取公司的名稱。但是,由於公司數量不多,並且在很多情況下用戶先後執行了許多操作,我想查詢所有公司一次,然後使用緩存的結果,而不是每個條目訪問dbase。

我該怎麼做?

回答

6

使用list_select_related指定的關係與查詢選擇,所以你的情況:

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_display領域,而無需自定義方法。

它應該爲您處理list_select_related(至少根據上面鏈接的文檔)。如果假設您的Companies型號具有name字段:

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