我想知道在哪里放置不属于视图的代码,我的意思是逻辑。
我一直在阅读一些类似的帖子,但无法得出结论。
我能理解的是:
那么所有基于逻辑的东西应该在哪里呢?
我来自Groovy / Grails,例如,如果我们需要访问数据库,或者我们有一个复杂的逻辑,我们使用服务,然后将这些服务注入控制器。
在Django中包含除Views和Models之外的东西的.py文件是一个好习惯吗?
PS:我读过一些人使用services.py
,但其他人说这是一种不好的做法,所以我有点困惑......
答案 0 :(得分:7)
我不知道你为什么这么说
我们不能在控制器中放入很多逻辑,我们也不能拥有很多逻辑的模型
你当然可以在任何一个地方放置逻辑。它在很大程度上取决于逻辑是什么:如果它与单个模型类特别相关,那么它应该放在模型中。但是,如果它与特定页面更相关,则可以进入视图。
或者,如果它是在多个视图中使用的更通用的逻辑,则可以将其放在单独的实用程序模块中。或者,您可以使用基于类的视图和定义逻辑的超类以及从中继承的子类。
答案 1 :(得分:6)
拥有java背景我可以与这个问题联系起来。 我已经在python上工作了很长一段时间。尽管我尽力将Java视为Java,将Python视为Python,但有时我将它们混合在一起以便我可以从中获得很好的效果。
简而言之
将所有与模型相关的内容放入模型应用中,它可以从简单的模型定义到自定义保存,预先保存钩子......
在视图中放置任何与请求/响应相关的内容,以及验证Jon模式,验证请求正文......处理异常等一些逻辑......
将您的业务逻辑放在每个视图目录/应用程序的单独文件夹/应用程序或模块中。含义在模型和视图之间具有单独的中间模块。
只要您保持一致,就没有严格的规则来组织您的代码。
项目:Ci
型号:ci / model / device.py
观看次数:ci / views / list_device.py
业务逻辑:
(1)ci / business_logic / 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的部分,它们应该保持尽可能小。