【问题标题】:Where to put business logic in djangodjango中业务逻辑放在哪里
【发布时间】:2011-08-02 17:59:01
【问题描述】:

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

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

  1. 将这些类定义为 java bean(即,只是 getter 和 setter,没有附加逻辑)
  2. 创建 AccountManager ejb 类,定义 create_account 方法(需要 1 个帐户,用户列表)
  3. 在web层准备数据,然后将数据传入AccountManager ejb,例如: accountManager.createAccount(account, userList)

但在 django 中,框架提倡将域逻辑放入模型类(行级)或关联的管理器类(表级)中,这让事情有些尴尬。是的,如果你的逻辑只涉及一张表是可以的,但是在实际应用中,通常每一步都会涉及到多个不同的表甚至数据库,那么这种情况我该怎么办呢?

把逻辑放到View里?我认为这根本不是一个好习惯。甚至覆盖模型类中的保存方法,使用 **kwargs 传入额外的数据?那么后端就会崩溃。

我希望这能说明我对业务逻辑应该放在 django 应用程序中的什么位置的困惑。

【问题讨论】:

    标签: django django-models transactions django-admin business-logic


    【解决方案1】:

    不确定您是否阅读过 Django 中关于Managers 的部分,它似乎可以解决您当前的情况。假设您定义了以下 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)
    

    业务逻辑仍在模型中。

    编辑

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

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

    【讨论】:

    • 嗨蒂埃里,你认为覆盖保存方法是个好主意吗?还。经理对象不应该更关注表级逻辑吗? (只是好奇,因为现在我非常相信你的方法)
    【解决方案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 方法添加到帐户模型中轻松完成。如果您觉得有必要将业务逻辑置于模型之外,尽管您始终可以创建一个新模块来承载您的业务逻辑,然后导入并在您的视图中使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 2012-07-16
        • 2014-10-10
        • 2013-09-04
        相关资源
        最近更新 更多