在多文件Django应用中从__init__进行相对导入

0 投票
3 回答
1106 浏览
提问于 2025-04-15 15:04

我有一个Django项目,路径在 /var/django/project/,而 /var/django/ 这个文件夹已经在系统的路径里。

在这个项目里,我有:

___init__.py
manage.py
utils/
    __init__.py
    tools.py

utils/__init__.py 里面有一个叫 get_preview 的函数。

utils/tools.py 里面有一个叫 get_related 的函数。

我想知道 utils/__init__.py 怎么能从 utils/tools.py 导入 get_related 呢?

还有,utils/tools.py 怎么能从 utils/__init__.py 导入 get_preview 呢?

我试过相对导入和静态导入,但在 tools.py 里用 from project.utils import get_preview 时总是出错。

3 个回答

2

是的,这种结构不好。你需要注意不要在这两个文件之间创建循环导入。关于循环导入的更多信息

2

你不能这样做(而且也不应该这样做)。如果你模块里的文件在引用和它相关的__init__.py里的代码,那说明你的代码结构很糟糕。你可以选择把这两个函数都放到__init__.py里,或者把它们都移出__init__.py,或者把它们放到不同的模块里。这就是你能做的几种选择。

0

你可以做到这一点,只需要在运行时进行其中一个导入,这样就能避免循环导入的问题。

比如说,在 __init__.py 文件中:

from project.utils.tools import get_related

def get_preview():
     # ...

还有在 tools.py 文件中:

def get_related():
    from project.utils import get_preview
    # ...
    get_preview()

撰写回答