
Отчёты и выгрузки в Django: где всё ломается на проде
Экспорт в Excel, который держит весь QuerySet в памяти, и CSV, который блокирует воркер на минуту, — типичные ошибки генерации отчётов в Django. Разбираем, как их избежать.

Экспорт в Excel, который держит весь QuerySet в памяти, и CSV, который блокирует воркер на минуту, — типичные ошибки генерации отчётов в Django. Разбираем, как их избежать.

Импорт CSV через save() в цикле упирается в тысячи запросов и часы работы. Разбираем bulk_create, COPY и внешний ETL — что выбрать под ваш объём и почему.

Загрузка миллиона строк через objects.create() в цикле займёт часы и съест память. Разбираем bulk_create, чанки, отключение сигналов и прямой COPY — с ценой каждого подхода.

Кто и когда поменял поле у заказа, откатить правку и не утонуть в мусорных записях. Разбираем django-simple-history, pghistory и ручной подход — с ценой каждого.

JSONField кажется удобным для гибких данных, но за гибкость платишь индексами, валидацией и запросами. Разбираем, когда он оправдан, а когда лучше нормальные колонки или отдельная таблица.

Вы включили django-simple-history, а таблицы истории разрослись быстрее основных, часть изменений в лог не попала, а bulk_update прошёл мимо аудита. Разбираем, где ломается аудит моделей и как чинить.

Мягкое удаление кажется безобидной строкой is_deleted=True, но ломает уникальные индексы, каскады и запросы через ORM. Разбираем, как реализовать soft delete в Django без сюрпризов в проде.

Как искать по вложенным ключам, обновлять данные без гонок и не платить за это скоростью. Разбор приёмов для JSONField в PostgreSQL с оговорками по индексам и другим СУБД.

Как хранить и запрашивать полуструктурированные данные в JSONField без сюрпризов: индексы, фильтры по вложенным ключам, разница между null и валидацией.

django-filter удобен на прототипе и коварен под нагрузкой: незаметный N+1, фильтр по всем полям и параметры, которые ловят SQL-инъекцию через ORM. Разбираем, что проверить до релиза.

Поиск на icontains ложится под нагрузкой и не находит «телефоны» по запросу «телефон». Разбираем, как перейти на полнотекстовый поиск PostgreSQL средствами Django и что за это платить.

Как задать фильтрацию списка в Django REST Framework: чистый FilterSet, method-фильтры, аннотации и raw-запросы. Что выиграете и чем заплатите в каждом случае.