2011-01-23 77 views
3

虽然我基于Django的项目,我总是试图按照Django的方法可重复使用的应用程序的工作 - 我试图相互分离我的应用程序,尤其是试图避免交叉引用,但有时它似乎不可能。避免循环依赖于Django应用程序

让我们考虑一个简单的例子与2个应用程序:文章和用户。文章应用程序定义文章模型,文章列表视图和单文章视图,用户应用程序定义用户模型和用户配置文件视图。文章是从作者领域引用用户,所以文章的应用显然依赖于用户的应用程序,这很好。

但是,当涉及到用户配置文件时,我想显示用户创建的最新文章(可能是用户查看的最新文章),但这使得用户应用程序知道文章应用程序,试图避免。

我能明显尽量推到模板级别的所有这样的引用,但它仍然没有完全解决这个问题,并在同一时间可能有时在数据库查询方面非常低效的。

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

回答

9

如果你真的对不具有“用户”应用和“文章”应用程序之间的对话集,那么你需要一个第三APP充当接口。这将知道用户和文章,并定义它们之间的所有联系。您的文章视图会在那里,因为它必须获取用户数据,并且您的用户配置文件视图将位于那里,因为它需要说“Fred写了5篇文章”。

无论这个级别脱钩的是值得的,我不知道。有时候为可重用性编程妨碍了首先将其用于可用性的方式。

+0

喜欢这个句子 - “有时候为可重用性编写程序会妨碍事物的可用性。” +1 – 2016-01-15 06:41:57

1

标准(或推荐)保持分离耦合的应用程序的方式是添加一个条件耦合 - 在一些应用程序,尝试导入Django的通知,只有当他们觉得,他们将事件报告给它像。如果你有两个应用程序可以通过设计相互对话,那么我没有看到将它们解耦的任何一点 - 在Django应用程序世界中有很多示例需要其他应用程序。请注意,我在这里谈论写现实的软件,不是一些学术delibrations :-)

-1

看来,在这种情况下,用户对文章的依赖是一种方法,而不是一个领域。 (无论是模型方法,模型类方法还是管理方法都不重要)。如果是这样,你可以在方法内部懒惰地导入文章。在执行此导入时,users.models将被完全加载,因此即使这是循环导入,也不会导致问题。文章中的“导入用户”声明不必重新加载用户,并且可以提供完整的用户名称空间。