python-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\'

2时,这会导致导入问题,所以如何解决这个问题?我试着使用一些django helper函数,希望这会有帮助,更具体地说,我试着使用django.db.models.get_app和get_model函数来导入模型,而不是直接导入它们,但我仍然遇到问题。当然,我可以将它们收集到同一个应用程序中,但我显然相信他们应该生活在不同的应用程序中,因为他们处理不同的事情。但是的,他们相互依赖。如果我不能解决进口问题,有什么想法如何设计这种不同?我当然可以使用一些泛型关系,但这实际上会让其他人更难理解,因为它没有指定它应该与之相关的内容类型。

1个回答

  1. 两个模型都不需要多对多字段。不要在模型中同时放置多对多关系的两边。当您放入一个多对多关系时,Django会为您插入关系的另一边。http://docs.djangoproject.com/en/1.1/topics/db/querys/#多对多关系的两端都可以自动访问另一端的API。API的工作方式就像上面提到的“向后”一对多关系。“当事件被触发时,我需要检查是否解决了某些任务”。这意味着事件可以通过其他方式触发,并且独立于任何任务。如果事件可以触发并导致任务,则任务依赖于事件。”当任务被解决时,可以“触发其他事件”这意味着任务依赖于事件。事件不依赖于任务。将事件的多对多引用放在任务中。在事件中不放置任何内容,因为事件可以在其他地方使用,以触发任务链和其他事件。某些客户端应用程序将只导入事件。此外,您可以使用字符串名称提供多到多个字段引用,而不是导入模型。

Leave a Reply

Your email address will not be published. Required fields are marked *

You can use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>