我正在寫幾個由設計至極的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