list_select_related, autocomplete_fields, поиска по индексируемым полям и отказа от дорогих подсчётов. Нужно измерять SQL-запросы и не включать тяжёлые вычисления в list_display.
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 или логи базы.
Оцени свой прогресс