Отладка медленных представлений администратора Django

Некоторые из моих просмотров в Django Admin слишком долго загружаются. Каков наилучший способ отладки в представлении администратора 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 и т.д. соответствующими именами полей.