在MVC架构中让我们考虑一下django:
我有一种计算年度最佳员工的方法(1000行代码具有复杂的逻辑),我应该在哪里定义它以及谁来调用它?
由于
答案 0 :(得分:26)
添加额外的Manager方法就是 添加“表级”的首选方法 模型的功能。
year_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()
答案 1 :(得分:12)
至于django,放置业务逻辑的最佳位置是模型内部。视图应该从业务逻辑中清除,并且应该仅用于使数据在模板上显示/显示,或者换句话说,仅将视图用于视图逻辑。
来自django FAQ:
在我们对MVC的解释中, “view”描述了获得的数据 呈现给用户。不是 必然是数据的外观,但是 提供哪些数据。风景 描述您看到的数据,而不是如何 你看到了这是一个微妙的区别。
通过将您的业务逻辑放在模型下,它将使您更容易进行单元测试,因为模型没有与HTTP方法或处理相结合。
答案 2 :(得分:7)
答案 3 :(得分:4)
我同意那些认为应该将这种逻辑放在models.py文件中的人。然而,有超过1k行代码的东西就像你拥有的那样大,会开始混乱models.py文件[对我来说]。我倾向于将这些代码移动到给定应用程序中的单独文件中。这样做没有坏处。
答案 4 :(得分:2)
这是自定义应用程序吗?如果是,那么从视图中提取业务逻辑实际上并不是真的可能。有时你必须把它放在那里有很多原因,其中一个原因是可维护性。
除此之外,计算应该在UI之外,在99.9%的情况下。
答案 5 :(得分:1)
我尝试遵循"skinny controller, fat model"概念(链接特定于Rails,但概念仍然适用)。您的控制器根本不应包含太多代码,除了处理会话,cookie,表单等。您的应用程序的所有实际逻辑应该驻留在您的模型中,以便以后更容易测试和重构。
答案 6 :(得分:0)
关于您的具体示例“一种计算年度最佳员工的方法(1000行具有复杂逻辑的代码)...我应该在哪里定义它以及谁来调用它?”
对于那么多代码,我可能会创建一个新模块(可能是ranking.py)并将其放在那里。谁会打电话取决于你如何使用它,但我猜它会从你的一个观点中调用。
答案 7 :(得分:0)
来自您的输入:
定义一个单独的模块“services.py”,用于保存具有复杂算法和逻辑的方法/类。
我们最终知道调用将来自视图(谁知道它想要什么),所以我们能做的最好的事情就是在模型中调用一个方法,从内部调用服务模块的逻辑,使用模型数据进行处理并返回要写入响应的结果。
感谢您的回复。