2017-06-23 12 views
0

私のデータモデルの1つにDjango amdinを使用しています。私は各モデルの管理UIにカスタマイズされた値を表示したい。 dbでは、単一のクエリの結果は、django adminで複数のクエリとして実行され、各行に対して1つずつ表示されます。 私はそれを避けようとしています。私が見た行ごとに、ページのロード中の単語のテーブルの上に1と意味のテーブルの上に他のを実行している2つのクエリがあり、第2のモデルについては複数のクエリを避けてDjango管理者のモデルデータを表示する

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) 

:ここ

は私のモデルです。 (デバッグツールバーから)

私は以下のオプションを使用して回避しようとしました。

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つだけのクエリ実行があります。しかし、モデルへの依存性は、クエリの結合で2つ以上のテーブルを持つので、それはまだ時間を消費します。だから私の質問は各行に対して1つのクエリを実行するのではなく、クエリ結果を各ページに直接表示できるかどうかです。ページ上の次のクエリの例結果の

select * from table ; 

代わりの

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

すべてのヘルプは大

答えて

2

あなたは上のlist_select_relatedオプションを使用する必要がありますappreciated.ThanksされますDjangoにJOINクエリを実行するように指示するModelAdmin。

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

は(あなたが本当にあなたのFKはword_idのようなものをフィールド呼び出すべきではありません、注意してくださいそれだけでwordと呼ばれるべきであるので、フィールドは、言葉の実際のインスタンスへのアクセスを提供します;。基礎となるDB列が自動的に呼び出されますword_id

+0

私の要件に合ったコードの場所と、複数のテーブルに参加する必要がある場合はどうすればいいですか? – user168983

+0

list_select_relatedはタプルなので、それ以上のことをするために何をすべきかを推測します。これはadmin.pyに入ります。モデルには組み込まれていないため、モデルに実装されていません。基本的に、 'list_select_related'は[query related tools](https://docs.djangoproject.com/ja/1.11/ref/models/querysets/#query-related-tools)を使って正しいことを行います。 – Melvyn

+1

私は参加から必要なものは単語ですが、単語IDではありません、これは私の必要条件にどのように役立つのですか? – user168983

関連する問題