2014-01-27 306 views
5

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

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

什么我可以理解为:

  • 视图是一样的控制器,以及大量的逻辑不应放在控制。
  • 模型不应该有很多的逻辑。

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

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

在Django中包含除视图和模型以外的东西的.py文件是否是一种很好的做法?

PS:我读过,有些人使用services.py,但随后其他人说这是一个不好的做法,所以我有点糊涂了......

回答

4

简短的回答:Django是更多的MTV或MVT(型号/模板/视图),如官方FAQ中所述: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“或任何你喜欢的东西。

+0

这是我见过的一堆Django的包,一个名为utils的文件。 py,我会开始使用这个,谢谢! – nelson687

1

如果功能很适合作为某个模型实例的方法,那就放在那里。毕竟,模型只是类。否则,只需编写一个Python模块(一些.py文件)并将代码放在那里,就像在任何其他Python库中一样。

不要把它放在意见。视图应该是你的代码中唯一知道HTTP的部分,它们应该尽可能小。

7

我不知道为什么你说

我们不能把大量的逻辑控制器,我们不能有车型有很多逻辑要么

您的当然可以把逻辑放在那些地方。这在很大程度上取决于这个逻辑是什么:如果它与单个模型类特别相关,它应该放在模型中。但是,如果它与某个特定页面更相关,它可以放在视图中。

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

6

有一个java背景我可以与这个问题有关。 我一直在python工作了一段时间。尽管我尽我所能将Java视为Python和Python,但有时候我将它们混合在一起,这样我就可以很好地处理这两者。

总之

  1. 放入模型应用中的所有模型相关的东西,也可能是从简单的模型定义,自定义保存,保存前钩.....

  2. 提出的任何请求/响应相关的东西在视图中,以及一些逻辑,如验证乔恩架构,验证请求主体...处理异常等。

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

只要你一致,没有严格的规则来组织你的代码。

项目:词

  • 型号:CI /模型/ device.py

  • 浏览:CI /视图/ list_device.py

  • 商业逻辑:

    • (1)ci/business_logic /discover_device.py

      或者

    • (2)CI /视图/ discover_device.py