[英]Avoiding multiple queries to display model data on Django admin
我正在為我的數據模型之一使用Django amdin。 我想在管理界面上為每種模型顯示自定義值。 在db上,單個查詢的結果在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;
.
.
.
非常感謝您的幫助。
您應該在list_select_related
上使用list_select_related
選項,以告訴Django執行JOIN查詢。
class MeaningAdmin(admin.ModelAdmin):
list_select_related = ('word_id',)
(請注意,您實際上不應該將FK字段word_id
類的word_id
。該字段可以訪問Word的實際實例,因此應僅將其稱為word
;基本的db列將自動稱為word_id
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.