я наткнулся на тот же вопрос в админке Django (версия 1.4.9), где довольно простые администраторы листинга страница была очень медленно при поддержке MySQL.
В моем случае это было вызвано ChangeList.get_query_set()
методом добавления чрезмерно широкого глобального select_related()
в запросе набора, если любые поля в list_display
было много-к-одному отношения. Для правильной базы данных (cough PostgreSQL cough) это не будет проблемой, но это было для MySQL еще раз, чем несколько подключений были вызваны таким образом.
Чистое решение, которое я нашел, состояло в том, чтобы заменить глобальную директиву 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
'select_related ('')' не работал для меня, это не мешало внутреннему соединению. Но, указав 'list_select_related = []' в классе admin, он сделал трюк! – rednaw