我正在写几个由设计至极的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函数来导入模型,而不是直接导入它们,但我仍然得到问题。
当然,我可以将它们收集到同一个应用程序中,但我清楚地相信它们应该生活在单独的应用程序中,因为它们处理单独的事情。但是,他们是互相依赖的。如果我无法解决进口问题,关于如何设计这个不同的任何想法?
我当然可以使用一些通用关系,但这实际上会让其他人更难理解,因为它没有指定它应该涉及的内容类型。
对吗?这是不一样的任务和事件。一项任务可能触发某些事件,但不是可能检查该任务是否解决的相同事件。 如果不是在同一个应用程序中,您可以使用字符串名称insted导入模型吗? – espenhogbakk 2010-03-10 04:42:20
http://docs.djangoproject.com/en/dev/ref/models/fields/#lazy-relationships表示可以使用跨智能的懒惰关系,所以我会尝试一下。 – espenhogbakk 2010-03-10 04:44:18
@Espen Christensen:你必须以某种方式打破循环。你不能在*两个地方有多对多的地方,它只能在一个地方。选一个。我更新了这个问题,解释了为什么我选择了我选择的那个。您可以选择“任务”而不是“事件”,但您必须选择唯一一个。在两个地方你都不可能有多对多的关系。 – 2010-03-10 11:02:36