Django admin (バージョン 1.4.9) で同じ問題に遭遇しました。MySQL を使用すると、かなり単純な管理リスト ページが非常に遅くなります。
私の場合は、フィールドが多対 1 の関係である場合に、クエリ セットにChangeList.get_query_set()
過度に広範なグローバルを追加するメソッドが原因でした。適切なデータベース (咳 PostgreSQL 咳) の場合、これは問題になりませんが、MySQL の場合は、この方法でいくつかの結合がトリガーされたことがありました。select_related()
list_display
私が見つけた最もクリーンな解決策は、グローバルselect_related()
ディレクティブを、本当に必要なテーブルのみを結合する、よりターゲットを絞ったディレクティブに置き換えることでした。select_related()
これは、明示的な関係名で呼び出すことで簡単に実行できました。
このアプローチは、複数のフォローアップ クエリのデータベース内結合を交換することになる可能性がありますが、MySQL が大きなクエリを処理している場合、多くの小さなクエリの方が高速である可能性があります。
多かれ少なかれ、私がしたことは次のとおりです。
from django.contrib.admin.views.main import ChangeList
class CarChangeList(ChangeList):
def get_query_set(self, request):
"""
Replace a global select_related() directive added by Django in
ChangeList.get_query_set() with a more limited one.
"""
qs = super(CarChangeList, self).get_query_set(request)
qs = qs.select_related('wheel') # Don't join on dealer or category
return qs
class CarAdmin(admin.ModelAdmin):
def get_changelist(self, request, **kwargs):
return CarChangeList