Вопрос проверяет понимание архитектурных подходов к организации бизнес-логики в Django, что критично для создания поддерживаемых и масштабируемых приложений.
Организация бизнес-логики — ключевой аспект архитектуры Django-приложения, влияющий на его тестируемость, поддерживаемость и возможность повторного использования кода.
Django поощряет размещение логики в моделях, следуя принципу 'модель — это не только данные, но и поведение'. Это делает код связанным с данными легко находимым.
# models.py
from django.db import models
from django.core.exceptions import ValidationError
class Order(models.Model):
STATUS_CHOICES = [('P', 'Pending'), ('C', 'Completed'), ('F', 'Failed')]
status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='P')
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
# Бизнес-логика внутри модели
def mark_as_completed(self):
if self.status != 'P':
raise ValidationError('Only pending orders can be completed.')
self.status = 'C'
self.save()
# Логика, связанная с завершением заказа
self._send_completion_email()
def _send_completion_email(self):
# Упрощённая логика отправки email
passДля сложных операций, которые затрагивают несколько моделей или требуют внешних вызовов, создают отдельные модули-сервисы. Это предотвращает раздувание моделей и отделяет логику от слоя данных.
# services/order_service.py
from .models import Order, Inventory
from django.core.exceptions import ValidationError
class OrderService:
@staticmethod
def process_order(order_id):
try:
order = Order.objects.get(id=order_id)
except Order.DoesNotExist:
raise ValidationError('Order not found')
# Проверка наличия товаров
for item in order.items.all():
if item.product.inventory.quantity < item.quantity:
raise ValidationError(f'Insufficient stock for {item.product.name}')
# Обновление инвентаря
for item in order.items.all():
item.product.inventory.quantity -= item.quantity
item.product.inventory.save()
# Изменение статуса заказа
order.mark_as_completed()
return orderФормы Django отлично подходят для инкапсуляции логики валидации и очистки данных. Менеджеры моделей (ModelManagers) полезны для централизации сложных запросов к базе данных.
# managers.py
from django.db import models
class ActiveOrderManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='P', total_amount__gt=0)Вывод: Используйте 'толстые модели' для простой логики, привязанной к одной сущности. Для кросс-модельных или комплексных операций создавайте сервисные классы. Этот гибридный подход сохраняет преимущества Django ORM, обеспечивая при этом чистую архитектуру.