从 。导入模型有效,但导入模型无效

from . import models works, but import models doesn't

我正在开发一个网络项目并使用 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"

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

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

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

你仍然可以进行相对导入,但你必须显式地进行,就像这样:

from . import models

因此,相对导入 from . import models 有效,而绝对导入 import models 无效。

为了使用绝对导入,您需要参考完整的 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 以获得关于导入包的很好的解释。