Django中的业务逻辑

时间:2014-01-27 10:40:38

标签: python django

我想知道在哪里放置不属于视图的代码,我的意思是逻辑。

我一直在阅读一些类似的帖子,但无法得出结论。

我能理解的是:

  • View就像一个控制器,很多逻辑不应该放在控制器中。
  • 模型也不应该有很多逻辑。

那么所有基于逻辑的东西应该在哪里呢?

我来自Groovy / Grails,例如,如果我们需要访问数据库,或者我们有一个复杂的逻辑,我们使用服务,然后将这些服务注入控制器。

在Django中包含除Views和Models之外的东西的.py文件是一个好习惯吗?

PS:我读过一些人使用services.py,但其他人说这是一种不好的做法,所以我有点困惑......

4 个答案:

答案 0 :(得分:7)

我不知道你为什么这么说

  

我们不能在控制器中放入很多逻辑,我们也不能拥有很多逻辑的模型

你当然可以在任何一个地方放置逻辑。它在很大程度上取决于逻辑是什么:如果它与单个模型类特别相关,那么它应该放在模型中。但是,如果它与特定页面更相关,则可以进入视图。

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

答案 1 :(得分:6)

拥有java背景我可以与这个问题联系起来。 我已经在python上工作了很长一段时间。尽管我尽力将Java视为Java,将Python视为Python,但有时我将它们混合在一起以便我可以从中获得很好的效果。

简而言之

  1. 将所有与模型相关的内容放入模型应用中,它可以从简单的模型定义到自定义保存,预先保存钩子......

  2. 在视图中放置任何与请求/响应相关的内容,以及验证Jon模式,验证请求正文......处理异常等一些逻辑......

  3. 将您的业务逻辑放在每个视图目录/应用程序的单独文件夹/应用程序或模块中。含义在模型和视图之间具有单独的中间模块。

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

    项目:Ci

    • 型号:ci / model / device.py

    • 观看次数:ci / views / list_device.py

    • 业务逻辑:

      • (1)ci / business_logic / discover_device.py

      • (2)ci / views / discover_device.py

答案 2 :(得分:4)

简短回答:Django更像是MTV或MVT(模型/模板/视图),如官方常见问题解答中所述:https://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names

业务逻辑在您的视图中占有一席之地,但没有什么能阻止您将其放入“utils.py”,“services.py”或任何您喜欢的内容中。

答案 3 :(得分:1)

如果该功能非常适合作为某个模型实例的方法,请将其放在那里。毕竟,模型只是类。

否则,只需编写一个Python模块(一些.py文件)并将代码放在那里,就像在任何其他Python库中一样。

请勿将其放在视图中。视图应该是代码中唯一能够识别HTTP的部分,它们应该保持尽可能小。