簡體   English   中英

避免多次查詢以在Django admin上顯示模型數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM