2010-03-09 105 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