避免Django应用程序中的循环依赖

时间:2011-01-23 14:35:31

标签: django architecture circular-dependency

在处理基于Django的项目时,我总是试图遵循Django对可重用应用程序的方法 - 我试图将我的应用程序彼此分离,特别是试图避免交叉引用但有时它似乎不是可能的。

让我们考虑一个包含2个应用程序的简单示例:文章和用户。文章应用定义了文章模型,文章列表视图和单篇文章视图,用户应用定义了用户模型和用户配置文件视图。文章引用了作者字段中的用户,因此文章应用程序显然依赖于用户应用程序,这很好。

但是当涉及到用户个人资料时,我想在该页面上显示用户创作的最新文章(可能是用户查看的最新文章),但这会使用户应用程序知道文章应用程序,这就是我的意思试图避免。

我显然可以尝试将所有这些引用推送到模板级别,但它仍然无法完全解决问题,同时在数据库查询方面可能效率非常低。

在这种情况下,你们做了什么?

3 个答案:

答案 0 :(得分:9)

如果您真的没有在“用户”应用和“文章”应用之间进行任何对话,那么您需要第三个应用作为界面。这将了解用户和文章,并定义它们之间的所有耦合。您的文章视图将在那里,因为它必须获取用户数据,并且您的用户配置文件视图将在那里,因为它需要说“Fred写了5篇文章”。

这种脱钩程度是否值得,我不知道。有时为可重用性进行编程会妨碍首先使用该东西。

答案 1 :(得分:1)

保持耦合应用程序分离的标准(或首选)方法是添加条件耦合 - 就像在某些尝试导入django通知的应用程序中一样,只有在找到它时,它们才向其报告事件。

尽管如此,如果你有两个应用程序通过设计相互交流,那么我认为在解耦它们方面没有任何意义 - 在Django应用程序世界中有很多例子只需要其他应用程序。请注意,我在这里谈论的是编写真实世界的软件,而不是关于某些学术研究: - )

答案 2 :(得分:-1)

在这种情况下,用户对文章的依赖性似乎是在方法中,而不是在字段中。 (无论是模型方法,模型类方法还是管理方法都是无关紧要的)。如果是这样,您可以在方法内部对文章进行延迟导入。执行此导入时,users.models将完全加载,因此即使这是循环导入,也不会导致问题。文章中的“import users”语句不必重新加载用户,并且可以使用完整的用户名称空间。