【问题标题】:from . import models works, but import models doesn't从 。导入模型有效,但导入模型无效
【发布时间】:2015-07-11 00:44:03
【问题描述】:

我正在开发一个网络项目并使用 Django。在我的views.py 文件中,我想访问要为其导入models 的数据库。

这是我的目录结构:

├── project  
│   ├── __init__.py  
│   ├── settings.py  
│   ├── urls.py  
│   └── wsgi.py  
├── app  
│   ├── admin.py  
│   ├── __init__.py  
│   ├── models.py  
│   ├── tests.py  
│   └── views.py  
├── manage.py

在我的views.py 中,我正在使用import models,但我得到的是importError。虽然from . import models 有效。

为什么?

但以下工作没有任何错误:

├── __init__.py
├── mod1.py
└── mod2.py

mod1.py

import mod2

print(mod2.foo())

mod2.py

def foo():
    return "Hello"

【问题讨论】:

    标签: python django python-3.x import


    【解决方案1】:

    为了使用绝对导入,您需要参考完整的 package.sibling 组合:

    import app.models
    from app import models
    from app.models import mymodel
    

    但是,显式相对导入是绝对导入的可接受替代方案:

    from . import models
    from .models import mymodel
    

    您真的应该 read PEP-8 on imports 了解有关导入包的详细说明。

    【讨论】:

    • 但是如果我制作一个单独的包,包含两个模块,然后进行相对导入,它可以工作吗?
    • 我不明白你的问题。
    • 这不是一个新包(没有目录)。这两个都在项目根目录下,所以你可以直接导入它们。
    • 但在我的情况下,views.pymodels.py 都位于包 app 的项目根目录中。
    • 那不是项目根目录。 app 是一个包。 views.pymodels.py 是“兄弟姐妹”。
    【解决方案2】:

    import models的问题是你不知道是绝对导入还是相对导入。模型可以是python路径中的一个模块,也可以是当前模块中的一个包。

    当本地包与 python 标准库包同名时,这很烦人。

    您可以使用from __future__ import absolute_import 完全关闭隐式相对导入。在PEP 328 中对其进行了描述,包括关于歧义的理由。我相信 Python 3000 已经完全关闭了隐式相对导入。

    您仍然可以进行相对导入,但您必须明确地进行,如下所示:

    from . import models

    因此,相对导入 from . import models 起作用,而绝对导入 import models 不起作用。

    【讨论】:

    • 但是如果我制作一个单独的包,包含两个模块,然后进行相对导入,它可以工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2018-01-13
    • 2016-12-01
    相关资源
    最近更新 更多