在MVC中(如Django)什么';什么地方最适合你的逻辑? MVC体系结构中的P>考虑Django:

在MVC中(如Django)什么';什么地方最适合你的逻辑? MVC体系结构中的P>考虑Django:,django,model-view-controller,Django,Model View Controller,我有一个计算年度最佳员工的方法(1000行代码,逻辑复杂),我应该在哪里定义它,谁来调用它 谢谢 把逻辑放在眼里是不允许的 您可以轻松、高效地编写单元测试 无法有效地重用。这表示 你不应该把 视图中的复杂逻辑 将其与视图分开 如果逻辑与 (类/类的对象)放置 模型中的逻辑是有道理的 以防逻辑紧密相连 可以使用多个对象/类 其中一个模型要放逻辑还是你 可以创建一个服务对象(或者当代码太大时),它 我们将处理这个逻辑 至于django,放置业务逻辑的最佳位置是模型内部。视图应与业务逻辑保持一致,并且

我有一个计算年度最佳员工的方法(1000行代码,逻辑复杂),我应该在哪里定义它,谁来调用它

谢谢

  • 把逻辑放在眼里是不允许的 您可以轻松、高效地编写单元测试 无法有效地重用。这表示 你不应该把 视图中的复杂逻辑 将其与视图分开
  • 如果逻辑与 (类/类的对象)放置 模型中的逻辑是有道理的
  • 以防逻辑紧密相连 可以使用多个对象/类 其中一个模型要放逻辑还是你 可以创建一个服务对象(或者当代码太大时),它 我们将处理这个逻辑

  • 至于django,放置业务逻辑的最佳位置是模型内部。视图应与业务逻辑保持一致,并且仅用于获取要在模板上显示/呈现的数据,或者换句话说,仅将视图用于视图逻辑

    发件人:

    在我们对MVC的理解中 “视图”描述获取的数据 呈现给用户。不是 数据的外观,但是 提供了哪些数据。景色 描述您看到哪些数据,而不是如何看到 你看到了。这是一个微妙的区别


    通过将您的业务逻辑置于模型之下,它将使您更容易进行单元测试,因为模型不与HTTP方法或处理相耦合。

    关于您的具体示例“计算年度最佳员工的方法(1000行具有复杂逻辑的代码)…我应该在哪里定义它,谁将调用它?”


    对于这么多的代码,我可能会创建一个新模块(可能是ranking.py)并将其放在那里。谁将调用它取决于您如何使用它,但我猜它将从您的一个视图中调用。

    我同意那些认为此类逻辑应该放在models.py文件中的人的观点。然而,像您拥有的一样大的东西,有超过1k行的代码,会开始使models.py文件(对我来说)变得杂乱无章。我倾向于将这些代码移动到给定应用程序中的单独文件中。这样做没有害处。

    来自

    添加额外的管理器方法是 添加“表级别”的首选方法 为您的模型添加功能

  • 使用该逻辑创建一个模块(
    year\u employee.py
  • 假设您有一个模型
    Employee
    ,那么,您应该创建一个用于管理员工的类:

    class EmployeeManager(models.Manager)
        def of_the_year(self):
            from year_employee import my_calc_func
            return my_calc_func()
    
  • 然后将此管理器添加到您的模型中

    class Employee(models.Model):
        [...]
        objects = EmployeeManager()
    
    之后,您可以简单地执行以下操作:

    chosen_employee = Employee.objects.of_the_year()
    

    这是自定义应用程序吗?如果是,那么从视图中提取业务逻辑就根本不可能了。有时你不得不把它放在那里,原因有很多,其中之一就是可维护性

    除此之外,99.9%的情况下,计算应该在UI之外。

    根据您的输入:

    定义一个单独的模块“services.py”,用于保存具有复杂算法和逻辑的方法/类

    正如我们所知,最终将从视图(谁知道它想要什么)进行调用,因此我们能做的最好的事情是在模型中调用一个方法,该方法在内部调用来自服务模块的逻辑,使用模型数据进行处理,并将结果返回到响应上

    感谢您的回复。

    我尝试遵循这个概念(link是Rails特有的,但这个概念仍然适用)。除了处理会话、cookie、表单等,您的控制器中不应该有太多代码。应用程序的所有实际逻辑都应该驻留在您的模型中,以便以后更容易测试和重构