PRO

Как оптимизировать Django Admin для больших таблиц?

Для больших таблиц Django Admin оптимизируют за счёт правильных индексов, ограниченного списка колонок, list_select_related, autocomplete_fields, поиска по индексируемым полям и отказа от дорогих подсчётов. Нужно измерять SQL-запросы и не включать тяжёлые вычисления в list_display.
Подробный ответ

Проблемы стандартного admin

На крупных таблицах Django Admin может быть медленным из-за N+1, тяжёлых фильтров, полного подсчёта записей, неиндексированного поиска и выпадающих списков с тысячами связанных объектов. Оптимизация начинается с анализа реальных SQL-запросов и плана выполнения.

Оптимизация списка

Стоит выводить в list_display только необходимые поля и избегать методов, которые выполняют запрос для каждой строки. Для связей ForeignKey можно использовать list_select_related.

from django.contrib import admin
from .models import Order


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ('id', 'user', 'status', 'created_at')
    list_select_related = ('user',)
    list_per_page = 50
    show_full_result_count = False

Связанные поля

Для больших таблиц связанных моделей не стоит использовать обычный select с тысячами вариантов. Вместо этого применяют autocomplete_fields или raw_id_fields.

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    autocomplete_fields = ('user',)

Поиск и фильтры

Поля в search_fields и часто используемые фильтры должны поддерживаться подходящими индексами базы данных. Нельзя бездумно добавлять поиск по большим текстовым полям или сложные list_filter, если они создают дорогие запросы.

Права и действия

Для тяжёлых массовых операций лучше запускать фоновую задачу, а не выполнять работу в HTTP-запросе admin. Также полезно ограничивать доступ и набор видимых данных через get_queryset(), особенно в multi-tenant системах.

Как ответить на собеседовании

Я оптимизирую Django Admin через индексы, минимальный list_display, list_select_related, autocomplete_fields и ограничение размера страницы. Отключаю полный подсчёт результатов, если он дорогой, не допускаю N+1 в методах admin и проверяю SQL через Debug Toolbar или логи базы.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге