Django中的业务逻辑

7
我想知道应该把不属于视图的代码放在哪里,我的意思是逻辑部分。
我读过一些类似的帖子,但不能得出结论。
我能理解的是:
1. 视图就像控制器,许多逻辑不应该放在控制器中。 2. 模型也不应该有太多逻辑。
那么所有基于逻辑的东西应该放在哪里呢?
我来自Groovy/Grails,例如,如果我们需要访问数据库或者有复杂的逻辑,我们使用服务,然后将这些服务注入到控制器中。
在Django中,除了视图和模型之外,将其他内容放在.py文件中是否是一个好习惯?
PS: 我读到有些人使用services.py,但其他人说这是一种不好的做法,所以我有点困惑...
4个回答

8

我不知道你为什么这样说

我们不能在控制器中放置大量逻辑,也不能将模型中有很多逻辑

你肯定可以把逻辑放在这两个地方之一。它很大程度上取决于该逻辑是什么:如果它特别与单个模型类相关,则应该放在模型中。然而,如果它更与特定页面相关,则可以放在视图中。

或者,如果它是多个视图中使用的通用逻辑,您可以将其放在单独的实用程序模块中。或者,您可以使用基于类的视图,其中具有定义逻辑的超类以及从中继承的子类。


8

作为一名有Java背景的程序员,我可以理解这个问题。我已经使用Python工作了相当长的时间。尽管我尽力将Java视为Java,将Python视为Python,但有时我会混淆两者,以便同时从两者中获得好处。

简而言之:

  1. 将所有与模型相关的内容放在models应用程序中,从简单的模型定义到自定义保存、预保存钩子等都可以。

  2. 将任何与请求/响应相关的内容放在views中,如验证Jon schema、验证请求体、处理异常等逻辑。

  3. 将业务逻辑放在独立的文件夹/应用程序中,或者每个视图目录/应用程序中都有一个模块。也就是说,在模型和视图之间有一个单独的中间模块。

没有严格的规则来组织您的代码,只要保持一致即可。

项目:Ci

  • 模型:ci/model/device.py

  • 视图:ci/views/list_device.py

  • 业务逻辑:

    • (1) ci/business_logic/discover_device.py

    • (2) ci/views/discover_device.py

5

这是我在许多Django包中看到的,一个名为utils.py的文件,我将开始使用它,谢谢! - nelson687
utils.py 通常听起来像是缺乏设计。它不会去其他地方,所以把它放在这里。业务逻辑肯定不应该放在 utils.py 中。 - wobbily_col
不,它不会。不要把所有东西都倒入utils.py中 - 这将变成一场噩梦! - michjnich

1
如果某个功能很适合作为某个模型实例的方法,就把它放在那里。毕竟,模型只是类。
否则,就像在任何其他Python库中一样,编写一个Python模块(.py文件)并将代码放在那里。
不要把它放在视图中。视图应该是您的代码唯一知道HTTP的部分,并且它们应该尽可能小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接