django - django中业务逻辑放在哪里

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

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

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

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

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

    将逻辑放入 View 中?我认为这根本不是一个好习惯。甚至覆盖模型类中的保存方法,使用 **kwargs 传入额外的数据?然后后端将中断。

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

    最佳答案

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

    业务逻辑仍在模型中。

    编辑

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

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

    关于django - django中业务逻辑放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616379/

    相关文章:

    JavaScript生成的Materialise卡片显示问题

    django - 如何从过滤后的有序查询集中获取上一个和下一个对象?

    php - MySQLi 准备好的语句和事务

    php - mysqli - 可以获取事务中之前两个查询的 insert_id 吗?

    java - 需要提交公开交易?

    python - 如何让 django runserver 向我显示 DeprecationWarnings 和其他有用的消息?

    mysql - Django:在给定多个 OR 参数的情况下获取特定项目的下一个和上一个项目 ID

    python - 如何自动启动 mod_wsgi-express 为 django 制作的 apachectl 脚本?

    Django 查询多对一关系

    Django:更新列,保存在变量名中