Djangoは管理者ページが強力なのが良い所だが、適当に使ってるとORMが雑なSQLを発行してしまうのでケアする。
まだ使い初めたばかりなので、適宜追加していく。
querysetを上書きして一覧ページのSQLを最適化する
list_displayにForeignKeyのフィールドを含んでいる場合 select_related が有効になる。が select_related は null=True なFKフィールドのリレーションを辿らないため、レコードの数だけ個別のSQLで対象を取得してしまう。よって一覧ページを開いた時にSELECT文が400回ぐらい発行されたりする。
また、 select_related は null=False なFKフィールドをどこまでも辿るため、10個や20個のテーブルとJOINするSQLになる事がある。
うまい具合にやるには queryset を自分で定義する。これで必要最低限なだけJOINさせる事ができる。
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 に指定するとテキストボックス + ラベル表示にしてくれる。
class UserProfileAdmin(admin.ModelAdmin):
raw_id_fields = ('user',)
公式ドキュメントではこちらに記述がある
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields