Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Django: Django, business logic, fat models, services, clean architecture

Как организовать размещение бизнес-логики в Django-приложении?

Вопрос проверяет понимание архитектурных подходов к организации бизнес-логики в Django, что критично для создания поддерживаемых и масштабируемых приложений.

Короткий ответ

В Django бизнес-логику традиционно размещают в моделях, делая их 'толстыми' (fat models). Это следует принципу 'модель содержит логику'. Однако для сложных операций, затрагивающих несколько моделей, или чтобы избежать раздувания моделей, используют сервисные слои или отдельные модули-сервисы. Также можно применять формы и менеджеры моделей для инкапсуляции логики валидации и запросов. Ключ — в согласованности подхода внутри проекта.

Длинный ответ

Организация бизнес-логики — ключевой аспект архитектуры Django-приложения, влияющий на его тестируемость, поддерживаемость и возможность повторного использования кода.

Традиционный подход: Fat Models

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

Сервисный слой (Service Layer)

Для сложных операций, которые затрагивают несколько моделей или требуют внешних вызовов, создают отдельные модули-сервисы. Это предотвращает раздувание моделей и отделяет логику от слоя данных.

# 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

Использование Forms и ModelManagers

Формы 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, обеспечивая при этом чистую архитектуру.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Django

    Django

Ключевые слова

#Django

#business logic

#fat models

#services

#clean architecture

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.