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

Kar*_*and 4 python django import python-3.x

我正在开发一个 web 项目并使用 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
Run Code Online (Sandbox Code Playgroud)

在我的views.pyI'm 中import models,但我得到了一个importError. 虽然from . import models有效。

为什么?

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

??? __init__.py
??? mod1.py
??? mod2.py
Run Code Online (Sandbox Code Playgroud)

模块1.py

import mod2

print(mod2.foo())
Run Code Online (Sandbox Code Playgroud)

mod2.py

def foo():
    return "Hello"
Run Code Online (Sandbox Code Playgroud)

rne*_*ius 6

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

import app.models
from app import models
from app.models import mymodel
Run Code Online (Sandbox Code Playgroud)

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

from . import models
from .models import mymodel
Run Code Online (Sandbox Code Playgroud)

你真的应该阅读关于导入的 PEP-8 以获得关于导入包的很好的解释。


Vau*_*ein 5

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

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

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

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

from . import models

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