Никогда не делай тяжёлую логику в Django views.
Новички часто пихают всё прямо во view:
- бизнес-логику
- валидацию
- расчёты
- работу с БД
- интеграции
В итоге получается "божественная функция" на 200 строк, которую невозможно тестировать и поддерживать.
Правильный подход — разделять слои:
- View — только принимает запрос и отдаёт ответ
- Services / use-cases — бизнес-логика
- Models — работа с данными
- Serializers / Forms — валидация
Плохо:
def create_order(request):
user = request.user
items = request.data['items']
total = 0
for item in items:
product = Product.objects.get(id=item['id'])
total += product.price * item['qty']
order = Order.objects.create(user=user, total=total)
...
Лучше:
# services/order_service.py
def create_order(user, items):
total = calculate_total(items)
return Order.objects.create(user=user, total=total)
# views.py
def create_order_view(request):
order = create_order(request.user, request.data['items'])
return Response({"id": order.id})
Почему это важно:
• проще тестировать
• код переиспользуется
• view не превращается в монстра
• легче менять логику, не трогая API
Django не заставляет делать так, но большие проекты без этого долго не живут.
Please open Telegram to view this post
VIEW IN TELEGRAM