如何从 Django 中的项目级包导入而不与同名的应用程序级模块冲突?

How to import from project level package in Django without conflicting with app level module with same name?

我有一个具有以下结构的 Django 项目 (Python 2.7.15):

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
        utils.py
    utils/
        __init__.py
        filters.py

在我的 utils/filters.py 文件中有一个 class MyFilter。然而,从 polls/admin.py 开始,当我尝试 运行 from utils.filters import MyFilter 时,我得到 ImportError: No module named filters。如何在不重命名 polls/utils.py 模块或 utils 包的情况下将我的自定义过滤器导入投票应用程序?

注意:这不是循环导入问题。即使我不从 utils/filters.py 导入任何东西,也会发生这种情况。这是 utils/polls/utils.py 之间的名称冲突。 Python 试图在 polls/utils.py 中找到 filters.MyFilter 但没有找到,因此抛出错误。我只是想想办法绕过这个冲突并强制python在项目根目录的utils/包中寻找filters.MyFilter

在Python2中,import utils是有歧义的,因为它可以是相对导入,也可以是绝对导入。

如果您通过将以下导入添加到模块顶部来启用 Python 3 行为,

from __future__ import absolute_import

然后 from utils.filters import MyFilter 将被视为绝对导入并起作用。

添加未来导入后,如果您想从 polls/admin.py.

导入 polls/utils.py,则需要使用显式相对导入 import .utils