Django应用之间相互依赖的循环导入问题

5 投票
1 回答
3028 浏览
提问于 2025-04-15 20:13

我正在写几个django应用,这些应用设计上是相互关联的。但是我遇到了循环导入的问题。我知道这可能是设计不太好,所以请给我一些更好的解决方案的例子。我找不到更合适的设计,如果没有更好的设计,那我该如何解决这个问题呢?

基本上这是两个django应用,它们有一些模型,相互之间有关系。简单来说,这个系统是一个基于事件的系统。所以有一个事件模型和一个任务模型。这两个模型分别在两个不同的应用中,分别是EventsTasks。当事件被触发时,我需要检查某些任务是否已经解决,而当一个任务被解决时,它又可以触发其他事件。

所以在Events中,我需要存储关于任务的数据(以检查这些任务是否解决),而在Tasks中,我需要存储关于事件的数据(哪些事件在任务解决时需要触发)。

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

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_appget_model函数来导入模型,而不是直接导入它们,但我仍然遇到问题。

当然,我可以把它们放到同一个应用中,但我认为它们应该分开,因为它们处理的是不同的事情。不过,它们确实是相互依赖的。如果我无法解决导入问题,有没有其他设计的想法呢?

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

1 个回答

7

这两个模型不需要多对多的字段。

不要在你的模型中同时放入多对多关系的两边。

当你在一个多对多关系中添加内容时,Django会自动为你处理另一边的关系

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

多对多关系的两端可以自动访问对方。这个访问就像是一个“反向”的一对多关系。

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

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

  • 如果一个事件被触发并且导致了任务的产生,那么任务就依赖于事件。

“当一个任务被解决时,这可以触发其他事件。”

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

在任务中放入对事件的多对多引用。在事件中不放任何东西,因为事件可以在其他地方使用,以触发一系列的任务和其他事件。有些客户端应用程序只会导入事件。

此外,你可以使用字符串名称来提供多对多字段的引用,而不需要导入模型。

撰写回答