从Django模型类中分离域类

时间:2011-06-21 12:54:25

标签: python django model

所以我已经完成了我的OO分析和我正在构建的Web应用程序的设计,现在我正在实施。已经做出设计决策来使用Python和Web开发框架Django来实现系统。

我想开始实现一些需要持久性的域实体类。似乎Django会让我实现这些作为继承自Django模型类的类,以便使用Django ORM进行持久化。但是,这似乎是我的类实体和持久性机制之间过于强烈的耦合。如果在某个阶段我想抛弃Django并使用另一个Web开发框架,或者只是放弃Django的ORM来替代它会发生什么?现在我必须从头开始重新编写我的域实体类。

因此,最好将我的域类实现为独立的Python类,将所有业务逻辑封装在这些类中,然后使用某种机制(设计模式,如桥或适配器或???)来委托这些的持久性存储Django ORM的域类,例如通过适当设置的Django模型类。

有没有人建议如何做到这一点?从我读过的所有内容看来,人们只是将它们的域类实现为从Django模型类继承的类,并在这个类中混合了业务逻辑。对于下线更改,维护,可重用性等,这似乎不太好。

4 个答案:

答案 0 :(得分:4)

你能认真地设想你可能会抛弃Django ORM,但保留其他一切吗?或者,如果你完全放弃了Django,你的代码的任何仍然适用?

你不抱怨如果你放弃了Django,你将不得不重写所有的模板。当然,你会,这是预料之中的。那么为什么表示层可以与框架绑定,而不是持久层呢?

要避免这种前期过度分析。 Django是一个RAD工具,最适合快速迭代开发。尽管如此,它还是能够构建一些功能强大,寿命长的应用程序,因为很多大公司都会证明这一点。但它不是Java,它不是“企业”,并且它不能完全符合OO原则。在Python世界中,这被看作是一个特征,而不是一个bug。

答案 1 :(得分:3)

嗯,使用Django的方法是继承Django的基础模型类。这是“活跃记录”模式。您的django模型将包含所有CRUD和查询方法以及业务逻辑(如果您决定添加它当然)。这被认为是java世界中的一种反模式,但关于它的一个很酷的事情是它可以非常快地加速开发。

答案 2 :(得分:0)

如果您需要不同的持久性机制,则不必“从头开始重写模型”。 activerecord风格的持久性系统的重点在于它对模型类施加了最小的约束,并且在很大程度上是透明的。

如果您真的很担心,请将任何依赖查询的代码抽象出自己的方法。

答案 3 :(得分:0)

我认为没有实现解耦Django模型和域类的解决方案,至少我没有找到任何解决方案。实际上,我所知道的唯一具有这种去耦的ORM仅存在于Smalltalk世界中,它被称为GLORP。它允许您将域模型保存在关系数据库中,而无需修改域类。我目前正在尝试实现类似的想法,以便从Django ORM中解耦。我的动机是当前DB表和域类之间的强耦合严重损害了软件的演变。如果我成功,我会再次发帖:)

相关问题