Help us understand the problem. What is going on with this article?

Django管理サイトのチューニング

More than 5 years have passed since last update.

Djangoは管理者ページが強力なのが良い所だが、適当に使ってるとORMが雑なSQLを発行してしまうのでケアする。
まだ使い初めたばかりなので、適宜追加していく。

querysetを上書きして一覧ページのSQLを最適化する

list_displayにForeignKeyのフィールドを含んでいる場合 select_related が有効になる。が select_relatednull=True なFKフィールドのリレーションを辿らないため、レコードの数だけ個別のSQLで対象を取得してしまう。よって一覧ページを開いた時にSELECT文が400回ぐらい発行されたりする。
また、 select_relatednull=False なFKフィールドをどこまでも辿るため、10個や20個のテーブルとJOINするSQLになる事がある。

うまい具合にやるには queryset を自分で定義する。これで必要最低限なだけJOINさせる事ができる。

admin.py
class UserRelationshipAdmin(admin.ModelAdmin):
    list_display = ('id', 'from_user', 'to_user', 'is_block', 'is_friend', 'created_at')

    def queryset(self, request):
        return super(UserRelationshipAdmin,
                 self).queryset(request).select_related('from_user', 'to_user')

件数が多い項目は raw_id_fields を指定する

ForeignKeyやchoicesフィールドはデフォルトでは詳細ページでプルダウン(select要素)で表示される。数万件になるテーブルが参照先になっている場合はえらい事になるので、 raw_id_fields に指定するとテキストボックス + ラベル表示にしてくれる。

admin.py
class UserProfileAdmin(admin.ModelAdmin):
    raw_id_fields = ('user',)

公式ドキュメントではこちらに記述がある
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away