Некоторые из моих просмотров в Django Admin слишком долго загружаются. Каков наилучший способ отладки в представлении администратора Django, чтобы узнать, что такое циклы повторения?
Отладка медленных представлений администратора Django
Ответ 1
Как прокомментировал rantanplan, панель инструментов отладки django - это самый простой способ начать профилирование (показывает все запросы, выполняемые при загрузке страницы, их EXPLAIN, их время, затраченное на выполнение, и т.д.). Вы могли бы также рассмотреть вопрос о профилировании медленной установки django здесь: Как профилировать приложение django относительно времени выполнения?
В этом вопросе упоминается использование hotshot, которое также упоминается в Django Wiki под профилирование django.
Ответ 2
Я тоже видел это с конкретными моделями в Django Admin, если их таблицы очень, очень большие (несколько миллионов записей будут делать трюк), а движок таблицы - это MySQL InnoDB. Мне потребовалось некоторое время, чтобы разобраться в обходных решениях, чтобы заставить администратора Django снова напевать столы с записями 100M+. Корневая проблема оказалась дорогостоящими COUNT(*)
запросами на загрузку страницы, а также плохо сконструированными поисковыми запросами, когда я использовал один из своих search_fields
из ModelAdmin.
Я зарегистрировал все мои решения здесь, чтобы однажды помочь бедному джанго-эру: http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/
Ответ 3
Если вы используете Django с MySQL, то в MySQL есть ошибка с оптимизацией INNER JOIN. Если вы попытаетесь использовать внешние ключи в Admin.list_display
, Django будет генерировать запрос с упорядочением и INNER JOINs, которые очень медленны в MySQL.
Есть два решения:
-
Использование django-mysql-fix backend: https://pypi.python.org/pypi/django-mysql-fix
-
Переопределить
get_query_set
в AdminChangeList - удалитьselect_related
и установить поляprefetch_related
- более подробная информация приведена в моем другом ответе здесь: fooobar.com/questions/538407/...
Ответ 4
Вот несколько хороших ответов относительно медленных форм редактирования, вызванных таблицами ForeignKey со многими записями Django изменяет форму загрузки довольно медленно
Что касается просмотров списка: 1) Вы можете добавить опцию list_per_page и показать меньше результатов:
class EventAdmin(admin.ModelAdmin):
list_per_page = 20
2) Или используйте select_related():
2.1) Для django < 1,6:
class EventAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
2.2) Для django >= 1.6:
class EventAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
Конечно, замените foreign_key_field1 и foreign_key_field2 и т.д. соответствующими именами полей.