在django中放置业务逻辑的位置

Where to put business logic in django

例如,帐户1-->*用户-->1身份验证一个帐户有多个用户,每个用户将有一个身份验证

我来自Java背景,所以我通常做的是

  • 将这些类定义为JavaBean(即,仅仅是GETER和SETER,没有逻辑附加)
  • 创建AccountManager EJB类,定义创建帐户方法(使用take1帐户,用户列表)
  • 在Web层中准备数据,然后将数据传递到AccountManager EJB,例如:accountManager.createAccount(account, userList)
  • 但在Django中,框架主张将域逻辑放入模型类(行级)或关联的管理器类(表级),这会使事情变得有点尴尬。是的,如果您的逻辑只涉及一个表,但在实际应用程序中,通常每个步骤都涉及多个不同的表甚至数据库,那么在这种情况下我应该怎么做呢?

    把逻辑考虑进去?我认为这根本不是一个好的练习。或者甚至覆盖模型类中的save方法,使用**kwargs传递额外的数据?然后后端将断开。

    我希望这说明了我对将业务逻辑放在Django应用程序中的位置的困惑。


    不确定你是否读过有关django经理的章节,它似乎能解决你目前的状况。假设您定义了以下Account模型,则User是内置的。

    1
    2
    3
    4
    5
    6
    7
    8
    # accounts/models.py

    class AccountManager(models.Manager):
        def create_account(self, account, user_list):
            ...

    class Account(models.Model):
        objects = AccountManager()

    如果管理器代码太大,可以在单独的文件中单独使用。在您看来:

    1
    2
    3
    4
    5
    # views.py

    from accounts.models import Account

    Account.objects.create_account(account, user_list)

    业务逻辑仍在模型中。

    编辑

    这里的关键字是override,而不是overwrite。如果覆盖模型的保存方法,则必须记住,来自Web应用程序和管理员的任何创建、更新操作都将使用此新功能。如果您只希望这些业务逻辑在特定的视图中发生一次,那么最好不要让它出现在save之外。

    我想你可以把你的业务逻辑放到它自己的常规类中。每次需要运行业务逻辑时,都必须实例化该类。或者,如果您想跳过OOP方法,可以将业务逻辑作为静态函数放在这个新类中。


    我要做的是,我的大多数应用程序都有带有业务逻辑的service.py文件。这是因为如果我需要一个能与多个应用程序的模型一起工作的函数,我就不能这样做:

    1
    2
    # shop/models.py
    from auth.models import User, Team

    此代码将被卡在循环引用循环中。

    但我很可能会从service.py转到具有如下结构的应用程序:

    1
    2
    3
    4
    5
    service/
        auth.py
        customers.py
        another_set_of_functions.py
        ...


    上面你用accountManager.createAccount(account,userlist)演示的例子看起来像是我向帐户模型添加createAccount方法时很容易做到的事情。如果您觉得需要将业务逻辑置于模型之外,那么您可以创建一个新的模块来承载业务逻辑,然后导入并在视图中使用。