LoginSignup
32
27

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-11-01

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

32
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
27