Сначала измерьте
ORM скрывает SQL, поэтому страница может слать сотни запросов без видимых признаков. Цикл профилирования всегда один: измерить, исправить, закрепить результат тестом.
| Инструмент | На что отвечает | Где |
|---|---|---|
| Debug Toolbar | сколько запросов шлёт эта страница | разработка |
assertNumQueries | не вырос ли счёт снова | тесты, CI |
nplusone | где сейчас N+1 | разработка |
silk | какие запросы и функции медленные | staging, API |
explain() | как база выполняет запрос | shell, любой этап |
Подключение Debug Toolbar
Установите pip install django-debug-toolbar. Всё добавляйте только при DEBUG:
# settings.py
if DEBUG:
INSTALLED_APPS += ["debug_toolbar"]
MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware")
INTERNAL_IPS = ["127.0.0.1"]# urls.py
from django.conf import settings
from django.urls import include, path
urlpatterns = [
# ...
]
if settings.DEBUG:
urlpatterns += [path("__debug__/", include("debug_toolbar.urls"))]⚠️ При пустом
INTERNAL_IPSпанель скрыта. В Docker добавьте IP шлюза контейнера или используйтеSHOW_TOOLBAR_CALLBACKвDEBUG_TOOLBAR_CONFIG. Ещё нуженdjango.contrib.staticfiles.
| Панель | Что показывает |
|---|---|
| SQL | запросы, время, дубли, кнопка EXPLAIN |
| Time | CPU и общее время |
| Templates | отрисованные шаблоны и контекст |
| History | прошлые запросы, включая AJAX |
| Profiling | функции через cProfile (по умолчанию выключена) |