【问题标题】:Avoiding circular dependencies in Django applications避免 Django 应用程序中的循环依赖
【发布时间】:2011-06-14 01:06:02
【问题描述】:

在处理基于 Django 的项目时,我一直在尝试遵循 Django 的可重用应用程序方法 - 我试图将我的应用程序彼此分离,尤其是尝试避免交叉引用,但有时似乎并非如此可能。

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

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

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

遇到这种情况你们怎么办?

【问题讨论】:

    标签: django architecture circular-dependency


    【解决方案1】:

    如果您真的决定在“用户”应用和“文章”应用之间不进行任何对话,那么您需要第三个应用来充当界面。这将了解用户和文章并定义它们之间的所有耦合。您的文章视图将在其中,因为它必须获取用户数据,并且您的用户个人资料视图将在其中,因为它需要说“Fred 写了 5 篇文章”。

    这种程度的脱钩是否值得,我不知道。有时,为了可重用性而进行的编程会阻碍使事物一开始就可用。

    【讨论】:

    • 喜欢这句话——“有时,为了可重用性而进行编程会阻碍使事物首先可用。” +1
    【解决方案2】:

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

    不过,如果您有两个应用程序在设计上可以相互通信,那么我认为将它们解耦没有任何意义 - 在 Django 世界中有很多应用程序只需要其他应用程序的示例。请注意,我在这里谈论的是编写真实世界的软件,而不是一些学术讨论:-)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 1970-01-01
        • 2010-10-28
        • 2012-02-15
        • 2012-08-10
        • 1970-01-01
        • 2019-08-20
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多