❤️ Это любовь, Django на практике: 10 самых распространённых проблем и как их решать (боевой опыт, шишки, мемы)
Если ты хоть раз запускал Django в прод, то знаешь: он как хороший старый Land Cruiser — надёжный, мощный, вывозит почти всё. Но иногда открываешь капот, а там… ну скажем так — сюрпризы. Причём такие, что ты начинаешь разговаривать с монитором вслух, хотя он тебя никак не слушает.
Сегодня пройдёмся по 10 проблемам, которые чаще всего встречаются в реальном бою. И самое главное — разберём, почему они возникают и что с этим делать, чтобы жить спокойно и меньше заказывать валерьянку.
Поехали.
🔥 Проблема №1: N+1 — скрытый убийца Postgres и нервов
Это классика. Django ORM делает вид, что всё ок, и ты такой: «ой, смотри, .all() работает, прикольно». А потом в логах видишь 547 запросов к базе, и всё — привет, N+1.
Как это выглядит:
И ты такой: «почему так?» А под капотом Django делает 1 запрос на посты и N запросов на авторов.
Лекарство: select_related и prefetch_related.
А если ManyToMany или reverse FK:
⚡ Проблема №2: Медленные админки, которые грузятся как GTA V
Django admin — великая вещь. Но как только там становится больше пары тысяч записей… ну ты понял.
Что делать:
- Добавь list_select_related
- Не тащи туда тяжёлые inline'ы
- Используй autocomplete_fields
И да, выключи тупые фильтры, которые генерят SELECT COUNT(*)
на каждую колонку.
🧬 Проблема №3: Миграции, которые конфликтуют и живут своей жизнью
Миграции Django — это как кот: пока смотришь, он милый. Пока не смотришь — сломал цветок.
Типичные проблемы:
- Конфликтующие миграции в разных ветках
- Разные developers любят переименовывать поля
- «Ну я кое-что подправил в старой миграции…»
Не трогай старые миграции. Никогда. НИ–КО–ГДА.
Что делать правильно:
- если накосячили — создавай новую миграцию, которая исправляет
- используй python manage.py makemigrations --merge
- в больших проектах — включи "squash" миграции раз в полгода
🌪 Проблема №4: Кашмар с настройками — настройки расползаются как лисы по лесу
settings.py со временем превращается в звезду смерти. Особенно когда:
- dev / stage / prod ветки
- секреты в переменных окружения
- разные базы
Используй:
- django-environ
- разделение settings: settings/base.pysettings/dev.pysettings/prod.py
Или будь взрослым человеком и переходи на Pydantic Settings (в Django они уже шикарно живут).
🧵 Проблема №5: Django и асинхронщина — это пока что брак по расчёту
Django 4+ умеет async, да. Но контроллеры, ORM — не полностью async.
Проблема: Ты пишешь async view, делаешь 3 ORM-запроса, думаешь, что они параллельные. А Django такой: «нет».
Как это исправить:
- Помнить, что Django ORM синхронный
- Если нужна настоящая async-магия — бери: Tortoise ORMencode/databasesили переходи на FastAPI (да, знаю, звучит как измена)
Но для большинства проектов — Django async-view достаточно, просто не путайся.
🔐 Проблема №6: Авторизация и права превращаются в болото
Django permissions — мощная штука. Но когда проект растёт, появляются такие монстры:
- кастомные User
- роли, которых больше, чем сотрудников
- API, которое должно вести себя по-другому, чем админка
Советы:
- Сразу делай кастомный User Даже если пока не нужен. Через год он понадобится.
- Используй django-guardian для per-object permissions
- Для DRF возьми нормальный JWT, а не session auth
🥶 Проблема №7: Django тормозит в проде — но не Django виноват
Тормозит не сам Django. Тормозит:
- медленная база
- неиспользование connection pool
- отсутствие кэша
- неправильные индексы
- тяжелые сериалайзеры
Шпаргалка производительности:
- включи Redis-кэш
- поставь индексы вручную, Django не всё делает сам
- DRF: ставь select_related и prefetch_related в queryset'ах сериалайзера
- используй async gunicorn или uvicorn workers
И да… пожалуйста… не раздавай статику через Django, мы же профессионалы, да?
🧱 Проблема №8: Django ORM и сложные запросы — боль, когда нужен SQL
Когда тебе нужен:
- lateral join
- window function
- хитрый CTE
- или условный update
Django ORM начинает пыхтеть.
Лекарство:
- .raw() — норм, если аккуратно
- QuerySet.explain() — покажет план запроса
- django-cte
- django-sql-utils
- или просто пиши SQL вручную, не бойся
Но помни: ORM — это не бог, а инструмент.
📦 Проблема №9: Циклические импорты — Django любит подставить в момент импорта моделей
Немного сборки на Django, много страданий от:
- circular imports
- AppRegistryNotReady
- «Models aren't loaded yet»
Лечение:
- импорт моделей внутри функций (да, выглядит неэстетично, но работает)
- вынос логики в отдельные сервисы
- использовать get_user_model() вместо прямого импорта User
И да, структура проекта должна быть такой, чтобы модели не знали всё обо всех.
🚀 Проблема №10: Деплой — самое весёлое (и страшное)
Запуск Django в прод — это ритуал, который каждую команду превращает в шаманов.
Но основные грабли такие:
- забыли сделать collectstatic
- забыли выполнить миграции
- не включили DEBUG=False
- забыли настроить ALLOWED_HOSTS
Эталонный чек-лист деплоя:
- pip install -r requirements.txt
- python manage.py migrate
- python manage.py collectstatic --noinput
- настроить gunicorn/uvicorn
- поставить Nginx как reverse proxy
- включить кеширование
- настроить логирование
И только тогда — «да, запустили, ребята, живёт».
🎉 Финальное слово от человека, который тоже страдал
Django — это не просто фреймворк. Это экосистема, огромная, мощная, проверенная годами. Она может быть бесконечно милой, но иногда ведёт себя так, словно ты обидел её чем-то.
Но когда ты знаешь её болячки — работаешь быстрее, спокойнее и увереннее. А кое-где — даже начинаешь получать удовольствие.
🙌 Если статья была полезной
Буду рад лайку и комментарию — это помогает продвигать материалы и показывает, что стоит разобрать в следующих публикациях.