Где поставить бизнес-логику в джанго
Например, учетная запись 1 → * Пользователь → 1 Аутентификация
1 имеет несколько пользователей, и каждый пользователь будет иметь 1 аутентификацию
Я исхожу из фона java, поэтому я обычно делаю
- определяют эти классы как java beans (т.е. просто getter и setter, без логики)
- создать класс AccountManager ejb, определить метод create_account (с учетом 1 учетной записи, списка пользователей)
- подготовка данных на веб-уровне, а затем передача данных в AccountManager ejb, например:
accountManager.createAccount(account, userList)
Но в django структура защищает то, что вы помещаете логику домена в классы моделей (уровень строк) или связанные классы менеджера (уровень таблицы), что делает вещи немного неудобными. Да, прекрасно, что если ваша логика включает только одну таблицу, но в реальном приложении обычно каждый шаг будет включать в себя несколько разных таблиц или даже баз данных, то что мне делать в этом случае?
Поместите логику в View? Я не думаю, что это хорошая практика. или даже перезаписать метод сохранения в классе модели, передав дополнительные данные с помощью ** kwargs? то бэкэнд сломается.
Надеюсь, это иллюстрирует мое замешательство в том, где бизнес-логика должна быть помещена в приложение django.
Ответы
Ответ 1
Не уверен, что вы прочитали раздел Managers в Django, он, кажется, решает вашу текущую ситуацию. Предполагая, что у вас установлена следующая модель Account
, встроен User
.
# accounts/models.py
class AccountManager(models.Manager):
def create_account(self, account, user_list):
...
class Account(models.Model):
objects = AccountManager()
Не стесняйтесь отделять код менеджера в отдельном файле, если он становится слишком большим. В ваших взглядах:
# views.py
from accounts.models import Account
Account.objects.create_account(account, user_list)
Бизнес-логика все еще находится в моделях.
ИЗМЕНИТЬ
Ключевое слово здесь переопределяется, а не перезаписывается. Если вы переопределите метод сохранения модели, вы должны иметь в виду, что любые операции создания, обновления из вашего веб-приложения и администратора будут использовать эту новую функциональность. Если вы хотите, чтобы такая бизнес-логика происходила раз в определенном виде, лучше всего оставить ее вне save
.
Я думаю, вы можете поместить свою бизнес-логику в свой собственный обычный класс. Вам придется создавать экземпляр этого класса каждый раз, когда вам нужно управлять бизнес-логикой. В качестве альтернативы вы можете поместить свою бизнес-логику в качестве статической функции в этом новом классе, если хотите пропустить подход ООП.
Ответ 2
Что я делаю, так это то, что большинство моих приложений имеют service.py
файл с бизнес-логикой. Это потому что, если мне нужна функция, которая работает с моделями из нескольких приложений, я просто не могу этого сделать:
# shop/models.py
from auth.models import User, Team
Этот код будет зациклен в циклическом эталонном цикле.
Но я скорее всего перейду от service.py
к приложению со структурой вроде этого:
service/
auth.py
customers.py
another_set_of_functions.py
...
Ответ 3
Ну, пример, который вы проиллюстрировали выше с помощью accountManager.createAccount(account, userList), похоже на то, что можно легко сделать, добавив метод createAccount в модель учетной записи. Если вы чувствуете необходимость принимать бизнес-логику вне модели, хотя вы всегда можете просто создать новый модуль, который будет размещать вашу бизнес-логику, а затем импортировать и использовать в своих представлениях.