Подтвердить что ты не робот

Где поставить бизнес-логику в джанго

Например, учетная запись 1 → * Пользователь → 1 Аутентификация 1 имеет несколько пользователей, и каждый пользователь будет иметь 1 аутентификацию

Я исхожу из фона java, поэтому я обычно делаю

  • определяют эти классы как java beans (т.е. просто getter и setter, без логики)
  • создать класс AccountManager ejb, определить метод create_account (с учетом 1 учетной записи, списка пользователей)
  • подготовка данных на веб-уровне, а затем передача данных в AccountManager ejb, например: accountManager.createAccount(account, userList)

Но в django структура защищает то, что вы помещаете логику домена в классы моделей (уровень строк) или связанные классы менеджера (уровень таблицы), что делает вещи немного неудобными. Да, прекрасно, что если ваша логика включает только одну таблицу, но в реальном приложении обычно каждый шаг будет включать в себя несколько разных таблиц или даже баз данных, то что мне делать в этом случае?

Поместите логику в View? Я не думаю, что это хорошая практика. или даже перезаписать метод сохранения в классе модели, передав дополнительные данные с помощью ** kwargs? то бэкэнд сломается.

Надеюсь, это иллюстрирует мое замешательство в том, где бизнес-логика должна быть помещена в приложение django.

4b9b3361

Ответ 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 в модель учетной записи. Если вы чувствуете необходимость принимать бизнес-логику вне модели, хотя вы всегда можете просто создать новый модуль, который будет размещать вашу бизнес-логику, а затем импортировать и использовать в своих представлениях.