2010-03-09 103 views
5

我正在写几个由设计至极的Django应用程序耦合在一起。但我得到了进口问题。我知道这可能是糟糕的设计,所以请举例说明更好的解决方案,但我似乎找不到更合适的设计。所以如果没有更好的设计,如何解决这个问题?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函数来导入模型,而不是直接导入它们,但我仍然得到问题。

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

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

回答

7

这两种模式都不需要多对多的字段。

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

当你把一个多对多的关系,Django插入关系的另一边为你

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

的许多一对多 关系两端,系统就会自动API访问 到另一端。该API仅作为 作为上面的“向后”一对多关系。

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

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

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

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

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

将对事件的多对多引用放在任务中。事件中没有任何内容,因为可以在其他地方使用事件来触发任务链和其他事件。某些客户端应用程序只会导入事件。

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

+1

对吗?这是不一样的任务和事件。一项任务可能触发某些事件,但不是可能检查该任务是否解决的相同事件。 如果不是在同一个应用程序中,您可以使用字符串名称insted导入模型吗? – espenhogbakk 2010-03-10 04:42:20

+0

http://docs.djangoproject.com/en/dev/ref/models/fields/#lazy-relationships表示可以使用跨智能的懒惰关系,所以我会尝试一下。 – espenhogbakk 2010-03-10 04:44:18

+1

@Espen Christensen:你必须以某种方式打破循环。你不能在*两个地方有多对多的地方,它只能在一个地方。选一个。我更新了这个问题,解释了为什么我选择了我选择的那个。您可以选择“任务”而不是“事件”,但您必须选择唯一一个。在两个地方你都不可能有多对多的关系。 – 2010-03-10 11:02:36