Django中应用间模型导入失败(循环导入?)

2 投票
1 回答
2800 浏览
提问于 2025-04-16 22:55

我在当前的Django项目中,遇到了在不同应用之间导入模型的问题。当我尝试运行开发服务器或同步数据库时,出现了错误:

File "/path/to/Project/../Project/app1/models.py", line 3, in <module>
class SomeModel(Thing):
NameError: name 'Thing' is not defined

问题是,Project/main/models.py中定义了一个名为Thing的模型,我通过以下方式在Project/app1/models.py中导入它:

from project.main.models import Thing

我知道,这种情况可能是因为Python防止循环导入导致的。

目前我有三个Django应用:main、app1和app2。

每个应用的导入方式如下:

main:

from project.app1.models import AnotherThing

app1:

from project.main.models import Thing

app2:

from project.main.models import Thing
from project.app1 import Something

我怀疑从app1导入模型到app2可能是问题的根源,因为这两个应用都从main导入模型,而main又从app1导入模型,形成了一个循环。

如果真是这样,我可以用什么其他方法来实现和这些导入相同的效果呢?有没有更好的组织方式,这样我就不会遇到这个问题了?

1 个回答

3

如果你想要对这些模型进行子类化,你需要解决循环依赖的问题。可以把一些共同的内容提取到另一个模块中,然后让这两个模块去导入这个新的模块,而不是互相导入。如果某个模型只是用作外键,你可以用字符串代替对象来延迟导入(比如 ForeignKey('app.Model') — 具体细节可以查看文档)。

撰写回答