4

結果をキャッシュし、今後のクエリで使用することにより、管理者からの dbase クエリを最適化しようとしています。しかし、各エントリの dbase リクエストがまだ表示されます。

私はこのようなモデルを持っています:

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

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

管理者の change_list で、次の表を確認したいと思います。

user    action    company_name

だから私は自分の管理者を次のように定義しました:

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

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

これを実行すると、ユーザーごとに、会社名を抽出するための会社モデルへのクエリがあることがわかります。ただし、多くの企業はなく、多くの場合、ユーザーは多くのアクションを次々に実行するため、すべての企業を一度クエリしてから、エントリごとにデータベースにアクセスする代わりに、キャッシュされた結果を使用したいと考えています。

どうやってやるの?

4

1 に答える 1

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')
于 2013-08-05T13:25:54.873 に答える