【问题标题】:django models = business logic + data access? Or data access layer should be separated out from django model?django模型=业务逻辑+数据访问?或者数据访问层应该从 django 模型中分离出来?
【发布时间】:2012-02-13 09:05:16
【问题描述】:

在 Django 中,建议的软件架构是将所有业务逻辑和数据访问放在模型中。

但是,有些同事建议数据访问层应该与业务逻辑(业务服务层)分开。他们的理由是,如果使用不同的数据源,数据访问层可以隔离更改。他们还说,存在可以在多个模型中的业务逻辑。

但是,当我开始使用单独的数据访问层和业务逻辑层进行编码时,数据访问层很简单(基本上是定义 db 架构的模型代码)并且似乎没有增加太多价值。

将数据访问从 django 模型中分离出来真的有价值吗,还是 django 已经通过其 ORM 提供了足够的数据访问层?

我正在寻找已经实现了大量 django 应用程序的开发人员,并了解他们的意见。这适用于中小型网络应用程序。

【问题讨论】:

  • 数据访问层是ORM。它与模型分开。你不会改变 ORM 的。您更改数据库引擎;这已经被 ORM 层变得微不足道了。目前尚不清楚您的同事所说的“数据访问层”是什么意思。你能提供更多信息吗?
  • @the_drow: OT:你能停止机器人审查并注意编辑吗? This suggested edit 是一个明显的评论,而不是应该被接受的建议编辑。
  • @MartijnPieters:我已经习惯了这些编辑风格。如果 SO 的文化发生了变化,我并没有意识到这一点。
  • @the_drow:请参阅meta discussion 引发的建议编辑。至少编辑应该有所改进; “希望有帮助”和“编辑”标题没有帮助。我认为该编辑应该是评论,除非您详细了解主题并同意从技术角度来看该编辑是正确的。

标签: django design-patterns django-models data-access-layer business-logic-layer


【解决方案1】:

经过三年的 Django 开发,我学到了以下几点。

ORM 是访问层。不需要更多了。

50% 的业务逻辑进入模型。其中一些在表格中重复或放大。

20% 的业务逻辑在表单中。例如,所有数据验证都在表单中。在某些情况下,表格会将一般领域(模型允许)缩小到特定于问题、业务或行业的某个子集。

20% 的业务逻辑在应用程序的其他模块中结束。这些模块位于模型和表单之上,但位于视图函数、RESTful Web 服务和命令行应用程序之下。

10% 的业务逻辑使用管理命令界面在命令行应用程序中结束。这是文件加载、提取和随机批量更改。

非常重要的是,视图函数和 RESTful Web 服务几乎什么都不做。他们尽可能多地使用模型、表格和其他模块。视图函数和 RESTful Web 服务仅限于处理变幻莫测的 HTTP 和各种数据格式(JSON、HTML、XML、YAML 等)。

尝试发明另一个访问层是零价值的练习。

【讨论】:

  • 一些关于 django 更显式架构的优秀细节:stackoverflow.com/questions/12578908/…
  • 我不同意 ORM 是数据访问层; ORM 包含大部分的数据访问层。在您的模型中直接使用 ORM 并将数据库表与模型属性相关联,可以将您的应用程序与关系数据库和特定的 ORM(例如 Django)耦合。这是 Django 使用的活动记录设计模式所固有的 (docs.djangoproject.com/en/dev/misc/design-philosophies)。如果你想解耦业务逻辑和数据访问,你应该使用数据映射器设计模式(例如 SQLAlchemy ORM 支持)。不过,对于某些应用来说,这可能有点过头了。
【解决方案2】:

答案取决于您的应用程序的要求。

对于将始终使用关系数据库并可以与特定 ORM 耦合的应用程序,您不需要分离数据访问和模型。 Django ORM 基于活动记录设计模式,假设数据访问和模型是在一起的。优点是简单,缺点是灵活性较低。

仅当开发人员想要完全解耦数据访问层和业务逻辑时,才需要分离数据访问和模型。您可以使用数据映射器设计模式来做到这一点。一些 ORM 支持这种设计模式,例如 SQLAlchemy。 Pro 更灵活,con 更复杂。

我推荐 Martin Fowler 撰写的《企业应用程序架构的模式》一书以了解更多详细信息。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2012-11-26
    • 1970-01-01
    • 2012-07-06
    • 2012-04-25
    • 2010-10-10
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多