Django应用程序的循环导入问题相互依赖

时间:2010-03-09 22:16:34

标签: python django design-patterns import

我正在编写一些设计耦合在一起的django应用程序。但我得到了进口问题。我知道这可能是糟糕的设计,所以请举出更好的解决方案示例,但我似乎无法找到更合适的设计。所以,如果没有更好的设计,如何解决这个问题?

它基本上是两个django应用程序,有一些模型,它们彼此交叉应用程序。简而言之,该系统是基于事件的系统。所以有一个事件模型和一个任务模型。它们存在于不同的应用程序,事件和任务中。触发事件时,我需要检查是否已解决某些任务,当任务解决时,可触发其他一些事件。

因此,在事件中我需要存储有关任务的数据(以检查这些任务是否已解决)以及我需要存储有关事件的数据的任务(当事件被解决时触发事件)

以下是我的应用中的一些示例代码:

Events app
models.py

from tasks.models import Task

class Event(models.Model):
    ...
    tasks = models.ManyToManyField(Task, help_text=_("Tasks we need to check if are solved before triggering this event."))
    ...


Tasks app
models.py

from events.models import Event

class Task(models.Model):
    ...
    events = models.ManyToManyField(Event, help_text=_("Events to trigger when this task i solved."))
    ...

当我尝试验证时,这会导致导入问题:

AttributeError: 'module' object has no attribute 'Event'

那么如何解决这个问题?我试图使用一些django辅助函数,希望这会有所帮助,更具体地说,我试图使用django.db.models.get_app和get_model函数导入模型而不是直接导入它们,但我仍然得到问题。

当然我可以将它们收集到同一个应用程序中,但我清楚地相信它们应该存在于不同的应用程序中,因为它们处理单独的事情。但是,他们是相互依赖的。如果我无法解决导入问题,那么如何设计这种不同的想法呢?

我当然可以使用一些通用关系,但这实际上会让其他人更难理解,因为它没有指定它应该与之相关的内容类型。

1 个答案:

答案 0 :(得分:7)

两种模型都不需要多对多字段。

不要在模型中放置多对多关系的双方。

当你提出一对多关系时, Django会为你插入关系的另一面

http://docs.djangoproject.com/en/1.1/topics/db/queries/#many-to-many-relationships

  

多对多的两端   关系获得自动API访问   到另一端。 API工作正常   作为一个“落后”的一对多   关系,上面。

“当触发事件时,我需要检查是否已解决某些任务”。

  • 这意味着事件可以通过其他方式触发,并且独立于任何任务。

  • 如果可以触发事件并导致任务,则任务取决于事件。

“任务解决后,可以触发其他一些事件”

  • 这意味着任务取决于事件。事件不依赖于任务。

将多对多引用放入任务中的事件。什么都不放在事件中,因为事件可以在其他地方使用,以触发一系列任务和其他事件。某些客户端应用程序仅导入事件。

此外,您可以使用字符串名称提供多对多字段引用,而不是导入模型。