Есть ли желание работать с Django с использованием Django ORM и архитектуры с бизнес-модулями
Что проверяют
Формально это вопрос о мотивации, но за ним стоит проверка: не будете ли вы тянуть проект к своему стеку и понимаете ли, что такое модульная архитектура на Django. Следом обычно просят рассказать, где у вас жила бизнес-логика и как модули общались между собой.
Как отвечать
Дайте прямой ответ и сразу подкрепите его конкретикой, иначе «да» ничего не значит.
По ORM покажите, что знаете его сильные и слабые места:
- ленивые
QuerySet: запрос уходит в базу только при итерации, срезе с шагом,len()илиlist(); - N+1: лечится
select_relatedдля внешних ключей иprefetch_relatedдля обратных связей и many-to-many; - выражения:
F()для атомарных обновлений без гонок,Q()для сложных условий,annotateиSubqueryвместо циклов в Python; - транзакции: по умолчанию Django работает в режиме автокоммита, группировать операции нужно через
transaction.atomic, а побочные эффекты вроде отправки задачи в Celery выносить вtransaction.on_commit.
Про бизнес-модули расскажите, как их понимаете: Django-приложения нарезаны по предметным областям, а не по техническим слоям. У модуля есть публичный интерфейс, например services.py для операций записи и selectors.py для чтения, а другие модули не лезут в его модели напрямую. Бизнес-логика не живёт во view и не размазывается по сигналам. Границы можно проверять автоматически через import-linter.
Если опыт был на FastAPI и SQLAlchemy, скажите это честно и покажите перенос: сессия и Unit of Work против автокоммита, selectinload против prefetch_related. Задайте встречный вопрос: как модули общаются, прямыми вызовами или событиями.
Где спотыкаются
Отвечают «да, конечно» и замолкают. Интервьюер не узнаёт ничего, кроме вежливости.
Ругают ORM: «он медленный, я пишу только сырой SQL». Звучит как нежелание работать с выбранным стеком, хотя разумная позиция другая: ORM по умолчанию, raw() или SQL для редких тяжёлых отчётов.
Кладут бизнес-логику в сигналы post_save. Поток выполнения становится неявным, а при bulk_create() и update() сигналы вообще не вызываются.