我正在开发一个webproject并使用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"
答案 0 :(得分:4)
import models
的问题在于您不知道它是绝对导入还是相对导入。 model可以是python路径中的模块,也可以是当前模块中的包。
当本地程序包与python标准库程序包同名时,这非常烦人。
您可以执行from __future__ import absolute_import
,完全关闭隐式相对导入。在PEP 328中描述了这种关于模糊性的理由。我相信Python 3000完全关闭隐式相对导入。
您仍然可以进行相对导入,但您必须明确地执行这些操作,如下所示:
from . import models
因此,相对导入from . import models
起作用,而绝对导入import models
不起作用。
答案 1 :(得分:4)
要使用绝对导入,您需要参考完整的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了解有关导入包的详细解释。