← Назад к вопросам

Что такое Django Fat Models?

2.0 Middle🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Django Fat Models: Антипаттерн архитектуры

Fat Models (толстые модели) — это антипаттерн в Django-разработке, когда вся бизнес-логика приложения скапливается в моделях. Это делает код сложным, неподдерживаемым и тесно связанным с Django ORM. В профессиональной разработке этого нужно избегать.

Что такое Fat Model?

Fat Model возникает, когда разработчик помещает слишком много логики в методы Django модели:

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    password = models.CharField(max_length=255)
    
    def register_user(self, password_confirm):
        if self.password != password_confirm:
            raise ValueError("Пароли не совпадают")
        
        send_email(self.email, "Добро пожаловать")
        log_action(f"Пользователь {self.name} зарегистрировался")
        process_payment(self, 99.99)
        self.save()

В этом примере модель отвечает за валидацию, отправку писем, логирование, обработку платежей — слишком много ответственности!

Проблемы Fat Models

Нарушение Single Responsibility — модель отвечает за слишком много.

Сложность тестирования — когда логика смешана с ORM, тестировать её сложнее.

Низкая переиспользуемость кода — логика привязана к Django моделям.

Сложность масштабирования — при росте проекта класс Model становится гигантским.

Зависимость от Framework — код не может использоваться вне Django.

Правильный подход: Тонкие модели

Модели должны определять только структуру данных и простые операции доступа:

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    password = models.CharField(max_length=255)

class UserService:
    @staticmethod
    def register_user(name: str, email: str, password: str, password_confirm: str) -> User:
        if password != password_confirm:
            raise ValueError("Пароли не совпадают")
        
        user = User(name=name, email=email, password=password)
        user.save()
        
        EmailService.send_welcome_email(email)
        logger.info(f"Пользователь {name} зарегистрировался")
        PaymentService.process_payment(user, 99.99)
        
        return user

Лучшие практики

  • Models — только данные и простые методы
  • Services — вся бизнес-логика
  • Managers — сложные QuerySet операции
  • Utils — вспомогательные функции

Этот подход делает код тестируемым, масштабируемым и независимым от Framework.

Что такое Django Fat Models? | PrepBro