2009-05-21 67 views
21

我在開發Django應用程序,其中有相當複雜的模型(模型是一所大學 - 課程,模塊,講座,學生等)的中間Django應用程序依賴循環

我已經分居項目到應用程序,使整個事情更加有組織(應用程序是課程,學校,人員,模塊和時間期限)。我有一個問題,一個應用中的模型可能依賴於另一個模型 - 所以我必須導入它。然後第二個應用程序依次依賴於第一個模型,所以有一個循環,Python會拋出一個錯誤。

人們如何處理這個問題?我知道應用程序應該相對「獨立」,但在這樣的系統中,例如使用ContentType將學生鏈接到模塊是沒有意義的。

有沒有人有類似的項目,可以評論這種情況?

+0

您的場景聽起來並不像應用程序的設計。應用程序的想法是可重用性(以及獨立的打包,分發和版本控制)。您可以通過不要將您的主題區域強制爲單獨的應用程序來節省一些麻煩。 – 2014-11-14 14:44:32

回答

52

如果您的依賴關係是在其他應用程序中使用外鍵引用模型,那麼您的不需要導入另一個模型的。您可以在ForeignKey的定義中使用的字符串:

class MyModel(models.Model): 
    myfield = models.ForeignKey('myotherapp.MyOtherModel') 

這樣就沒有必要進口MyOtherModel,所以沒有循環引用。 Django在內部解析字符串,並且它按預期工作。

1

通常我主張分裂功能集成到更小的應用程序,但模型之間的圓形的依賴反映了你可能不會獲得從分割多,可能只是考慮合併的應用程序這樣的緊密集成。如果這導致感覺應用程序太大,則可能有辦法沿不同的軸進行分割,從而導致更加健全的依賴關係圖。

3

如果你看到圓模型依賴我猜的三件事情之一發生:

  • 您已經定義了一個已經定義的(例如兩個課程,一個相反的關係有許多的講座和講座有一門課程),這是多餘的在Django
  • 你在錯誤的應用
  • 你在一個模型的方法提供功能的模型方法應該是在經理

也許你可以告訴我們這些模型中發生了什麼,我們可以嘗試找出問題出現的原因。循環模型依賴性很少表明您需要組合兩個應用程序 - 更有可能(儘管不是絕對如此)您的模型定義存在問題。

p.s.我am工作在一個類似的Django應用程序,但我的應用程序結構可能與你的很不同。如果你有興趣,我很樂意給你一個關於它的高級描述。

+0

有趣。我有詳細的問題是,一個模塊(模塊應用程序)有一個ForeignKey人(人的應用程序),爲其學生。 TutorGroup在人員應用程序中有一個ForeignKey to Module - 將一個導師組分配給一個特定的模塊。這就是導致依賴週期的原因。如果它仍然不清楚,我可以發佈模型圖。 我很想看看你項目的總體結構 - 看看別人怎麼做事情真的很有用。 – 2009-05-22 08:56:40

+0

模塊和人之間的關係多對多(看起來應該是這樣)?如果是這樣,您可以使用related_name參數設置爲'students'來定義Person中的關係。然後module_instance.students.all()會給你我想要的查詢集。 就我而言,我沒有Person模型。我的課程對用戶有兩個關係,一個是學生,另一個是教師。保持它超級簡單。 – ozan 2009-05-22 10:29:08

4

這可能不是很適合你的情況,但忽略了Django的方面你的問題,打破循環依賴一般的技術是打出來的交叉引用的項目之一到一個新的模塊。例如:

moduleA: class1, class2 
      |  ^
      v  | 
moduleB: class3, class4 

將變成:

moduleC: class 3 
     ^
      | 
moduleA: class 1, class 2 
        ^
        | 
moduleB:   class 4 

(或者,你可以有破2級伸到自己的模塊,或者兩者兼而有之。!)

當然,這是沒有如果A類& B互相依賴,請協助。在這種情況下,也許他們應該在同一個模塊中,或者更好的是,也許這些類的某些部分可以分解爲第三個模塊,這兩個類都依賴於這些模塊。