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

时间:2011-04-11 02:59:15

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

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

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

  1. 将这些类定义为java bean(即,只是getter和setter,没有附加逻辑)
  2. 创建AccountManager ejb类,定义create_account方法(带1个帐号,用户列表)
  3. 在网络层中准备数据,然后将数据传递到AccountManager ejb,例如: accountManager.createAccount(account, userList)
  4. 但是在django中,框架主张将域逻辑放入模型类(行级)或关联的管理器类(表级),这使得事情有点尴尬。是的,如果您的逻辑只涉及一个表,但是在实际应用程序中,通常每个步骤都涉及多个不同的表甚至数据库,那很好,所以在这种情况下我应该怎么办?

    将逻辑放入View?我认为这根本不是好的做法。甚至覆盖模型类中的save方法,使用** kwargs传入额外的数据?然后后端会破裂。

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

3 个答案:

答案 0 :(得分:13)

不确定您是否阅读过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)

业务逻辑仍在模型中。

修改

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

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

答案 1 :(得分:3)

我正在做的是我的大多数应用都有service.py个带有业务逻辑的文件。这是因为如果我需要一个与多个应用程序中的模型一起使用的函数,我根本无法做到这一点:

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

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

但是我很可能会从service.py转移到具有以下结构的app:

service/
    auth.py
    customers.py
    another_set_of_functions.py
    ...

答案 2 :(得分:0)

上面用accountManager.createAccount(account,userList)说明的示例似乎可以通过向帐户模型添加createAccount方法轻松完成。如果您觉得需要在模型之外采用业务逻辑,尽管您可以随时创建一个托管业务逻辑的新模块,然后在视图中导入和使用。