在MVC(例如Django)中,放置重型逻辑的最佳位置是什么?

Vis*_*hal 16 django model-view-controller

在MVC架构中让我们考虑一下django:

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

谢谢

Pyd*_* UA 26

来自Django文档

添加额外的Manager方法是向模型添加"表级"功能的首选方法.

  1. 用该逻辑创建一个模块(year_employee.py)
  2. 假设您有一个模型Employee,那么,您应该创建用于管理员工的类:

    class EmployeeManager(models.Manager)
        def of_the_year(self):
            from year_employee import my_calc_func
            return my_calc_func()
    
    Run Code Online (Sandbox Code Playgroud)

然后将此经理添加到您的模型中

class Employee(models.Model):
    [...]
    objects = EmployeeManager()
Run Code Online (Sandbox Code Playgroud)

之后你可以这样做:

chosen_employee = Employee.objects.of_the_year()
Run Code Online (Sandbox Code Playgroud)


Jos*_*ogi 12

至于django,放置业务逻辑的最佳位置是内部模型.视图应该从业务逻辑中清除,并且应该仅用于使数据在模板上显示/显示,或者换句话说,仅将视图用于视图逻辑.

来自django FAQ:

在我们对MVC的解释中,"视图"描述了呈现给用户的数据.它不一定是数据的外观,而是呈现的数据.该视图描述了您看到的数据,而不是您的看法.这是一个微妙的区别.

通过将您的业务逻辑放在模型下,它将使您更容易进行单元测试,因为模型没有与HTTP方法或处理相结合.


Ram*_*ttu 7

  1. 在View中放置逻辑将不允许您轻松编写单元测试并且无法有效地重用.这表示您不应该将复杂逻辑放在视图中,您应该将它与视图分开.
  2. 如果逻辑与(类的类/对象)紧密相关,那么将该逻辑放入模型中是有意义的.
  3. 如果逻辑与多个对象/类紧密相关,您可以使用其中一个模型来放置逻辑,或者您可以创建一个服务对象(或者当代码太大时)来处理这个逻辑.