2017-06-23 81 views
0

我對我的一個數據模型使用Django amdin。我想在每個模型的管理界面上顯示自定義值。 在db上,單個查詢的結果以django admin上的多個查詢運行,每行一個 我試圖避免這種情況。避免多個查詢在Django上顯示模型數據admin

這裏是我的模型:

class words(models.Model): 
    word_id=models.AutoField(primary_key=True) 
    word=models.CharField(max_length=200,unique=True) 
    def __unicode__(self): 
     return '%s - %s' % (self.word,self.word_id) 

class meanings(models.Model): 
    id=models.AutoField(primary_key=True) 
    word_id=models.ForeignKey(words,on_delete=models.CASCADE,db_column='word_id') 
    meaning=models.CharField(max_length=200) 
    def __unicode__(self): 
     return '%s %s %d ' % (self.spelling_id.spelling,self.meaning,self.id) 

對於第二個模型,而加載頁面,對於每一行,我看到有一個運行在詞表及其他有關含義表2次的查詢。 (從調試工具欄)

我試圖避免通過使用下面的選項。

models.py:

class meanings(models.Model): 
    meaning_id=models.AutoField(primary_key=True) 
    word_id=models.ForeignKey(words,on_delete=models.CASCADE,db_column='word_id') 
    meaning=models.CharField(max_length=200) 

admin.py:

def modified_output(self): 
     cursor = connection.cursor() 
     cursor.execute("select word,meaning,id from meanings a,words b where a.word_id=b.word_id and meaning_id= "+str(self.id)) 
     row = dictfetchall(cursor) 
     a=unicode(row[0]['word']) 
     b=unicode(row[0]['meaning']) 
     d=(row[0]['id']) 
     return '%s %s %d ' % (a,b,d) 


meanings.add_to_class("__str__", modified_output) 

現在對於每行只有1查詢運行。但由於對模型的依賴關係在查詢連接中有兩個以上的表,它仍然會佔用時間。所以我的問題是不是每行都運行1個查詢,我們可以直接爲每個頁面顯示查詢結果。

對頁面上的下面的查詢結果的例:

select * from table ; 

,而不是

select * from table when id=1; 
select * from table when id=2; 
. 
. 
. 

任何幫助是極大appreciated.Thanks

回答

2

您應該使用在該list_select_related選項ModelAdmin告訴Django執行JOIN查詢。

class MeaningAdmin(admin.ModelAdmin): 
    list_select_related = ('word_id',) 

(請注意,你真的不應該打電話給你FK場之類的東西word_id領域可以訪問到Word的實際情況,所以它應該只是被稱爲word;底層數據庫列將自動被調用word_id

+0

我沒有得到你的代碼段在哪裏符合我的要求,以及如果我必須連接多個表。 – user168983

+0

list_select_related是一個元組,因此猜測要做什麼以進行更多的連接。這進入admin.py。它沒有在模型上實現,因爲它不屬於模型。基本上,'list_select_related'使用[查詢相關工具](https://docs.djangoproject.com/en/1.11/ref/models/querysets/#query-related-tools)來做正確的事情。 – Melvyn

+1

我需要從加入是詞但不是詞id,我沒有得到如何這有助於我的要求 – user168983