ImportError:模型A引用模型B,模型B引用模型A.

时间:2010-01-22 20:38:46

标签: python django circular-dependency

我认为这比Django更像是一个蟒蛇问题。

但基本上我在模特A做的事情:

from myproject.modelb.models import ModelB

和模特B:

from myproject.modela.models import ModelA

结果:

  

无法导入名称ModelA

我做了禁止的事吗?感谢

2 个答案:

答案 0 :(得分:6)

通过在新命名空间中从上到下执行Python模块来导入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')

答案 1 :(得分:2)

相互导入通常意味着您错误地设计了模型。

当A取决于B时,你也不应该依赖A来使用B.

将B分为两部分。

B1 - 取决于A。

B2 - 不依赖于A.

A取决于B1。 B1取决于B2。圆形度已删除。