2010-01-22 97 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