当前位置: 首页 > 面试题库 >

django:胖模型和瘦控制器?

马梓
2023-03-14
问题内容

这是一个通用的体系结构问题。我在许多地方读到,在MVC框架中,(1)模型应该很胖,而控制器应该很瘦。但是我也读到(2)细节取决于您正在开发的框架。因此,如果您正在使用django开发,该怎么办?

我在django中的经验是,很多逻辑最终都被放入视图和表单中。不是“业务逻辑”,而是处理请求,会话等的细节。就代码行而言,这些细节通常超过处理模型对象的业务逻辑。我是在做错什么,还是这是Django的工作方式?


问题答案:

MVC不是通用解决方案,大多数情况下它做错了并且不能兑现其诺言:实际上,修改模型也需要在控制器中进行修改,因为这样做是错误的。如果您确实想要Model与Controller之间的松散耦合,那么-
人们通常会忽略这一点-您 必须
使用服务模式(以图片形式打开)。实际上几乎没有人这样做。

Django并没有盲目地遵循PHP世界中的MVC大惊小怪/伪模式,而是采取了务实的方法。因为在软件开发的普遍现实中,开发人员编写了程序供用户查看。然后,用户(您的老板,客户,客户…)将“看到”您的工作,并最终给出他对如何“看到”它的意见。通过使用Django,开发人员可以采用更“面向视图”的开发模式,然后猜测一下:它使截止日期更容易遵守,用户也更加满意。如果您考虑一下,它具有“
nosql-ish”的想法,即视图(通用视图,而不是django视图)应该是幕后事情的老板。

我要感谢Django没有做错MVC,这与99%的PHP MVC实现不同。

另一方面,Django是唯一允许在应用程序之间适当隔离的框架。每个应用程序可以具有:

  • 楷模
  • 意见
  • 范本
  • 网址
  • 静态文件
  • 测试
  • 形式
  • 可选插件(管理员,用于ajax选择的过滤器,django-authority的权限,django-notifications的通知等)

因此,即使将模型/视图/模板捆绑在一起,您的项目也可以相应地划分为小型(也称为:易于维护)和松散耦合的应用程序。仅将 相关的
模型/视图/模板/材料捆绑在一起。在Django中,您不需要的是具有较大的胖视图和url脚本的胖模型脚本。例如,您不希望像Article和FootballMatch这样的两个模型类一起生活,而是想要制作一个可以独立生活的“
articles” /“ blog”应用程序和“
sport”应用程序。当然,有时必须将它们捆绑在一起,在这种情况下,在90%的情况下在项目级别是可行的(如果您碰巧需要捆绑模型或模板标签,则可以制作另一个应用程序“
blog_sport”)。

例如,在Model类中定义get_absolute_url()方法是一种超常规的做法。是的,您的模型类在理论上只必须包含业务逻辑,现在与您的url定义相关联。实际上这有多糟糕?好吧,实际上它很出色,因为添加此方法需要两秒钟,然后您可以在使用模型的任何地方使用它:在视图或模板中使用它。另外,其他应用程序(即django.contrib.admin)也将使用它。

Django辉煌的另一个稍微复杂的例子是查询是惰性计算的。这意味着,您的视图函数/类将定义一个类似blog_list =
Blog.objects.all()的查询,但是如果该查询实际上是在模板中执行的,则其调用方式为{%{
因此,在这种情况下,如果在呈现模板之前发生故障,则模板中会发生业务逻辑:您保存了一个查询。但这还不是全部,如果您的模板仅显示一个计数{{blog_list.count}},则根本不会产生
select 查询 而仅执行一个计数查询。“一般视图”决定了需要什么业务逻辑。这与MVC的承诺相去甚远,但说实话:那有多实际?

我的观点是,您可以错误地运用理论,正确地运用理论(这将您的选择减少为喜欢5种包含所有语言的 Web
框架),或者只是以一种优雅而务实的方式达到目的,以禅宗的方式完成工作立即:这是Django的选择。



 类似资料:
  • 问题内容: 我试图理解模型上的“胖”与控制器上的“瘦”的概念,根据我一直在讨论的内容,我有以下示例(取自freenode的讨论): 问:在MVC范例中,其所说的Fat模型是瘦控制器。我在这里思考的是,如果我有很多方法(在控制器上)仅对CRUD使用了一些抽象方法(在模型上),那么我是在创建胖控制器而不是模型吗?还是他们说,胖模子,退回了什么却没有输入?这是我从未理解过的东西=)任何评论表示赞赏!非常

  • CodeIgniter 的开发基于 MVC(模型-视图-控制器)设计模式。MVC 是一种 用于将应用程序的逻辑层和表现层分离出来的软件方法。在实践中,由于这种分离 所以你的页面中只包含很少的 PHP 脚本。 模型 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。 视图 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一

  • 英文原文:http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ Ember.ArrayController用于代表一组模型。通过在路由的setupController方法中设置ArrayController的model属性,来指定其代表的模型。 可以将ArrayControl

  • 主要内容:,创建模型,操作数据(CRUD),其他数据操作,,链接模型模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段。模型是在 app/models.py 中定义(在我们的例子中是:myapp/models.py) 创建模型 下面是创建一个 Dreamreal 模型实例 − 每一个模型继承自django.db.models.Model。 我们类有4个属性(3 CharField和1个整数),这将是表中的字段。 Meta类与db_table

  • 我们现在将要创建的是一个能存储我们博客所有文章的东西。为了达到这个目的,我们将要讲解一下一个被称为objects(对象)的东西. 对象 在编程中有一个概念叫做 面向对象编程 。 它的思想是,与其用无聊的一连串的程序指令方式写程序,我们不如为事物建立模型,然后定义他们是怎样互相交互的。 那什幺是对象呢?它是一个属性和操作的集合。它听起来很奇怪,但我们会给你一个例子。 如果我们想塑造一只猫的模型,我们

  • Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。 MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过本站的 MySQL 教程 了解更多Mysql的基础知识。 如果你没安装 mysql 驱动