11

ModelAdmin外部キー フィールドを含むクラスがありますlist_display。しかし、そのモデルの管理者リスト ページでは、結合 ( ) ではなく、1 行に 1 つのクエリを実行して、他のテーブルからデータを取得する、何百ものクエリを実行していますselect_related()

Django docsは、これをなくすために ModelAdmin に属性として追加できることを示していますが、私にとってはまったく機能していないようです。This SO questionは同様の問題を引き起こしているようですが、彼の解決策は不明であり、私の場合はうまくいきません。list_select_related = True

これが私のモデルとモデル管理者の縮小版です:

class Device(models.Model):
    serial_number = models.CharField(max_length=80, blank=True, unique=True)
    label = models.CharField(max_length=80, blank=True)

    def __str__(self):
        s = str(self.serial_number)
        if self.label:
            s += ': {0}'.format(self.label)
        return s

class Event(models.Model):
    device = models.ForeignKey(Device, null=True)
    type = models.CharField(max_length=40, null=False, blank=True, default='')

class EventAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'device')
    list_select_related = True

ただし、それを追加してlist_selected_related = Trueも何も変わりませんでした。SQL 結合の代わりに、このような多くのクエリを取得します。

結合ではなく、多くのクエリ

Django 管理者が list_select_related を無視して N 個のクエリを実行しているように見える理由はありますか? Python 2.7 と Django 1.3.3 を使用しています。

4

3 に答える 3

18

ここでの問題は、設定がクエリにlist_select_related = True基本を追加するだけであるということselect_related()ですが、その呼び出しはデフォルトで ForeignKeys with に従いませんnull=True。したがって、答えは、チェンジリストが使用するクエリセットを自分で定義し、従う FK を指定することです。

class EventAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'device')
    def queryset(self, request):
        return super(EventAdmin, self).queryset(request).select_related('device')
于 2013-03-04T22:13:14.863 に答える
10

Django 1.6 以降、呼び出しlist_select_relatedに含めるフィールドの名前を持つブール値、リスト、またはタプルを受け入れます。select_related()したがって、次を使用できるようになりました。

class EventAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'device')
    list_select_related = ['device']
于 2015-02-25T03:52:04.273 に答える