【问题标题】:Django import error when apps with same name同名应用程序时Django导入错误
【发布时间】:2023-03-28 10:45:01
【问题描述】:

我的django项目的结构是:

project
    book (an app)
        __init__.py
        views.py
        models.py
        urls.py
        ...
    api (an app)
        __init__.py
        problem.py
        book (another app for REST API)
            __init__.py
            views.py
            urls.py
            ...

当我在 api/problem.py 中尝试“from book.models import *”时,django 说“ImportError: No module named models”。我认为这是因为它尝试导入不存在的“api/book/models.py”。如何从根文件夹导入模块?谢谢。

【问题讨论】:

  • 不要使用import *,它会产生冲突。只进口你需要的东西。首先确保您需要导入的每个文件夹都存在__init__。 api 不需要单独的应用程序。只需在book 中创建api.py(以及您打算创建的所有其他应用程序都需要公共api。
  • 其实我很困惑。您想从哪个models 导入?第一个 book 的 models.py 还是 api/book/<models.py> ?如果是后一种情况,是的,您肯定缺少模型。但是,如果您无法从第一种情况导入,请确保 __init__ 存在并尝试从 project.book.models import some_class 导入,因为您观察到它正在尝试导入本地图书版本。
  • 第一种情况。 project/book/ 中有一个 init.py,当我使用“python manage.py shell”时,我可以“from book.models import *”,但在project/api/problem 中不能。 py。仍然需要帮助,谢谢!
  • 你能编辑你的帖子并告诉我们所有必要的文件吗(包括__init__.py?我觉得奇怪from project.book.models import some_class不起作用。
  • 好的。项目文件夹中没有 init.py。

标签: python django import importerror


【解决方案1】:

如果你极度绝望,可以试试这个。

from django.contrib.contenttypes.models import ContentType
model_ct = ContentType.objects.get(app_label="book", model="some_model_you_gonna_import")
target_model = model_ct.model_class()

通过这样做,您可以获得您可能需要的课程。 (使用 target_model 作为您要导入的模型)

顺便说一句,我试过这个。应该管用。 :p

【讨论】:

    【解决方案2】:

    我的解决方案是清理项目结构,使 api.book 改为 book.api。

    例如,将您的项目结构为:

    project
        book (an app)
            views.py
            models.py
            urls.py
            api (another app for REST API)
                views.py
                urls.py
                ...
            ...
        api (an app)
            __init__.py
            problem.py
            ...
    

    【讨论】:

    • 你的意思是每个应用都有api文件夹吗?
    • 是的,但不是。我会修改答案来解释
    【解决方案3】:

    你可以尝试相对导入,参考PEP 328

    # in api.problem.py
    from ..book.models import something
    

    不推荐这种风格,但如果重构包结构和名称有困难,它会有所帮助。

    【讨论】:

    • 仍然没有名为 book.models 的模块
    • 你的 sys.path 是什么样的?你是在 shell 中而不是在 manage.py run 中得到这个吗?
    猜你喜欢
    • 2017-08-04
    • 2019-07-03
    • 1970-01-01
    • 2016-12-18
    • 2015-01-10
    • 2017-01-09
    • 1970-01-01
    • 2016-11-12
    • 2011-01-20
    相关资源
    最近更新 更多