Ответ вслух Senior Django: устройство обновлено

Где держать бизнес-логику в Django

Вопрос

Где вы держите бизнес-логику в Django-проекте: в моделях, вьюхах, сигналах? Почему?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «Вьюхи держу тонкими: разобрать запрос, проверить права, вызвать сервис, сформировать ответ. Если логика живёт во вьюхе, её не переиспользовать из management-команды, Celery-задачи или админки, и тестировать приходится через HTTP.

Что должно прозвучать в ответе

  • Толстые вьюхи плохо тестируются и дублируются между API и админкой

  • Модели: поведение, относящееся к одной сущности

  • Слой сервисов или use cases для операций над несколькими моделями

  • Сигналы только для слабо связанных побочных эффектов, явные вызовы предпочтительнее

  • Транзакции на уровне сервиса, побочные эффекты после коммита (`on_commit`)

  • Селекторы для сложных запросов на чтение

Что могут спросить следом

  • Почему сигналы сложно отлаживать?
  • Как отправить письмо только после успешного коммита транзакции?

Разбор

Образцовый ответ: «Вьюхи держу тонкими: разобрать запрос, проверить права, вызвать сервис, сформировать ответ. Если логика живёт во вьюхе, её не переиспользовать из management-команды, Celery-задачи или админки, и тестировать приходится через HTTP. Поведение, касающееся одной сущности, кладу в модель: вычисляемые свойства, проверка инвариантов. Операции над несколькими моделями, вроде «оформить заказ: списать остатки, создать платёж, отправить уведомление», выношу в слой сервисов: обычные функции, принимающие данные и возвращающие результат, внутри transaction.atomic. Побочные эффекты вроде писем и задач в очередь ставлю через transaction.on_commit, чтобы они не ушли при откате. Сигналы использую редко: они делают логику неявной, не срабатывают на update() и bulk_create, и по коду не видно, что сохранение заказа отправляет письмо. Сложные запросы на чтение собираю в функции-селекторы, это упрощает оптимизацию».

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.