TGViewer
Python Community Python Community @python_community_ru · 11.6K subscribers
Post #3090 1.1K
Продвинутый совет по Django:

Не тащи бизнес-логику в views и serializers. Выноси её в отдельный service layer.

Пока проект маленький, удобно писать всё прямо во view: получил request, дёрнул ORM, что-то посчитал, сохранил, отправил ответ.

Но как только появляются повторяющиеся сценарии, несколько точек входа, celery-задачи, admin, API и тесты, код начинает расползаться.

Хороший паттерн такой:
• view отвечает только за HTTP,
• serializer за валидацию,
• model за данные,
• а вся бизнес-логика живёт в services.

Пример:


# services/order_service.py

from django.db import transaction
from .models import Order, OrderItem

class OrderService:
@staticmethod
@transaction.atomic
def create_order(*, user, items_data):
order = Order.objects.create(user=user, status="new")

order_items = [
OrderItem(
order=order,
product_id=item["product_id"],
quantity=item["quantity"],
price=item["price"],
)
for item in items_data
]
OrderItem.objects.bulk_create(order_items)

return order

Во view тогда остаётся только это:


def create_order_view(request):
serializer = OrderCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)

order = OrderService.create_order(
user=request.user,
items_data=serializer.validated_data["items"],
)

return Response({"order_id": order.id})


Что это даёт: код проще тестировать, логика не дублируется, её можно использовать в API, admin и background jobs, и становится меньше шансов сломать что-то при росте проекта.

Django-проект становится серьезнее в тот момент, когда ты перестаёшь писать всё во views.

🐍 Python полезные ресурсы ( )

@Python_Community_ru
More from @python_community_ru
  1. Oct 1, 2026🔥 Бесплатный курс по Claude Code на русском: от установки до команды агентов На GitHub вы…
  2. Sep 30, 2026🖥 Cayu - open-source runtime для долгоживущих ИИ-агентов на Python Проект закрывает инфра…
  3. Sep 29, 2026🖥 Примеры кода на Python 2026: лучшие практики, разбор и задачи с решениями Python пример…
  4. Sep 28, 2026🚀 Jina-OCR-v1 разбирает целые страницы в Markdown со скоростью 2,57 страницы/с Jina AI пр…
  5. Sep 27, 2026🐍 В Python 3.15 решили мягко «похоронить» re.match() re.match() никуда не удаляют, но для…
  6. Sep 26, 2026⚡️ Qwen-Image за 6 шагов: Viggle ускорили генерацию и редактирование в 5 раз Viggle выложи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →