Я пишу проект в Django, и я вижу, что 80% кода находится в файле models.py
. Этот код запутан, и через некоторое время я перестаю понимать, что на самом деле происходит.
Вот что меня беспокоит:
- Я считаю уродливым, что мой уровень модели (который должен был быть ответственный только за работу с данными из базы данных) также отправка электронной почты, переход по API на другие службы и т.д.
- Кроме того, я считаю неприемлемым размещать бизнес-логику в представлении, потому что
таким образом становится трудно контролировать. Например, в моем
приложения существует как минимум три способа создания новых
экземпляры
User
, но технически они должны создавать их равномерно. - Я не всегда замечаю, когда методы и свойства моих моделей становятся недетерминированными и когда они развиваются побочные эффекты.
Вот простой пример. Сначала модель User
была такой:
class User(db.Models):
def get_present_name(self):
return self.name or 'Anonymous'
def activate(self):
self.status = 'activated'
self.save()
Со временем это превратилось в это:
class User(db.Models):
def get_present_name(self):
# property became non-deterministic in terms of database
# data is taken from another service by api
return remote_api.request_user_name(self.uid) or 'Anonymous'
def activate(self):
# method now has a side effect (send message to user)
self.status = 'activated'
self.save()
send_mail('Your account is activated!', '…', [self.email])
Я хочу отделить объекты в моем коде:
- Объекты моей базы данных, уровень базы данных: что содержит мое приложение?
- Объекты моего приложения, уровень бизнес-логики: что может сделать мое приложение?
Каковы наилучшие методы реализации такого подхода, который может быть применен в Django?