2010-01-22 100 views
2

我認爲這是一個比Django更蟒蛇的問題。ImportError:模型A參考模型B,模型B參考模型A

但基本上我在A型做:

from myproject.modelb.models import ModelB 

,並在B型:

from myproject.modela.models import ModelA 

結果:

cannot import name ModelA

我是不是被禁止?謝謝

+1

dupe http://stackoverflow.com/questions/744373/python-cyclic-imports – 2010-01-22 20:41:38

+0

我找不到我的問題的答案,我可以得到一些額外的幫助嗎?不是我做得可能嗎? – Clash 2010-01-22 20:48:23

回答

6

通過在新的命名空間中執行它自上而下導入Python模塊。當模塊A導入模塊B時,A.py的評估暫停,直到模塊B加載完畢。當模塊B然後導入模塊A時,它將獲得模塊A的部分初始化名稱空間 - 在您的情況下,它缺少ModelA類,因爲導入myproject.modelb.models發生在該類的定義之前。

在Django中,您可以通過名稱而不是類對象引用模型來解決此問題。所以,不要說

from myproject.modela.models import ModelA 
class ModelB: 
    a = models.ForeignKey(ModelA) 

你可以使用(不含進口):

class ModelB: 
    a = models.ForeignKey('ModelA') 
+0

非常感謝托馬斯!拯救了我的一天! 順便說一下,我認爲'a = models.ForeignKey('ModelA')'的語法是'models.ForeignKey('module.model')',這就是它對我的工作原理! – Clash 2010-01-22 20:55:12

2

相互進口通常意味着你設計你的模型不正確。

當A依賴於B,你不應該有B還取決於A.

歇B插入兩個部分。

B1 - 取決於A.

B2 - 不依賴於A.

A依賴於B1。 B1取決於B2。循環刪除。

+0

謝謝你的回答!一個人最多參與一個項目,一個項目只有一個領導。你如何從中刪除圓形? 人員引用一個項目。項目引用它的領導者(人物) – Clash 2010-01-22 20:56:57

+0

@Clash:多對多關係不需要雙方明確引用其他關係。你可以在其中一箇中做到這一點。和。爲什麼他們在單獨的模塊? – 2010-01-22 21:17:46

+0

S. Lott,這不是多對多的關係,一個人屬於一個項目,一個項目有一個領導者 – Clash 2010-01-22 21:36:30