【问题标题】:ImportError: Model A references Model B, Model B references Model AImportError:模型 A 引用模型 B,模型 B 引用模型 A
【发布时间】:2010-01-22 20:38:46
【问题描述】:

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

但基本上我在 Model A 做:

from myproject.modelb.models import ModelB

在 B 型:

from myproject.modela.models import ModelA

结果:

无法导入名称 ModelA

我在做被禁止的事情吗?谢谢

【问题讨论】:

标签: python django circular-dependency


【解决方案1】:

一个 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')

【讨论】:

  • 非常感谢托马斯!拯救了我的一天!顺便说一句,我认为a = models.ForeignKey('ModelA') 的语法是models.ForeignKey('module.model'),这对我来说就是这样!
【解决方案2】:

相互导入通常意味着您的模型设计不正确。

当 A 依赖于 B 时,你不应该让 B 也依赖于 A。

将 B 分成两部分。

B1 - 取决于 A。

B2 - 不依赖于 A。

A 取决于 B1。 B1 取决于 B2。循环已移除。

【讨论】:

  • 感谢您的回答!一个人最多参与一个项目,一个项目只有一个领导者。你如何从中消除循环性?人员引用了一个项目。项目引用它的领导者(人)
  • @Clash:多对多关系不需要双方明确引用对方。您可以只在两者之一中执行此操作。和。为什么它们在不同的模块中?
  • S. Lott,这不是多对多的关系,一个人属于一个项目,一个项目有一个领导
  • @Clash:相互关系,如多对多,可以只在一个地方声明,并正确引用另一个地方。您不需要两者相互包含。 为什么它们在不同的模块中?
  • 哦,谢谢 S.Lott!这可能是因为我误解了模块的概念......我认为项目和人应该是不同的模块,因为它们是不同的东西
猜你喜欢
  • 2017-03-23
  • 2012-03-18
  • 1970-01-01
  • 2020-05-30
  • 2022-10-13
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多