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

  • 20
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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