Django 从同级包导入时出错
我正在学习django,跟随“与django的探戈” 我的项目结构如下:Django 从同级包导入时出错,django,python-3.x,python-import,subdirectory,siblings,Django,Python 3.x,Python Import,Subdirectory,Siblings,我正在学习django,跟随“与django的探戈” 我的项目结构如下: /django_demo |-- __init__.py |-- manage.py |-- populate.py |-- settings.py |.....<other modules> | |--/django_demo | |-- __init__.py | |-- populate_rango.py | |...<other modules> | |--/rango | |--
/django_demo
|-- __init__.py
|-- manage.py
|-- populate.py
|-- settings.py
|.....<other modules>
|
|--/django_demo
| |-- __init__.py
| |-- populate_rango.py
| |...<other modules>
|
|--/rango
| |-- __init__.py
| |-- models.py
| |-- apps.py
| |....<other modules>
模型
导入出现了未解决导入
错误,尽管我根据文档使用了正确的符号,以及[here][3]上的类似问题
查询2-
根/django demo
包下的populate.py
包含以下代码:
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings')
import django
django.setup()
from django_demo.rango import models
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings')
import django
django.setup()
from rango import models
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new_django.settings')
import django
django.setup()
from rango.models import
从文档中,必须使用或虚线符号从子文件夹导入
上面的代码都不使用。我不明白这是怎么回事
from rango import models
不会引发未解决的导入错误
注1:我已将我的appname包含在\django\u demo\settings.py
下的已安装的应用程序中
INSTALLED_APPS = [
'rango.apps.RangoConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles', ]
\rango\apps.py
具有RangoConfig
类:
class RangoConfig(AppConfig):
name = 'rango'
注2:
1.我所有的\uuuu init\uuuuu.py
文件都是空的
我正在使用virtualenv和python 3.5.2作为Ubuntu上pydev+eclipse的解释器
更新-1
从下面的回溯中可以看出,给出运行时错误的是django.setup()
:
Traceback (most recent call last):
File "/home/sat/coding/python_dev/oxygen_workspace/django_demo/django_demo/populate_rango.py", line 10, in <module>
django.setup()
File "/home/sat/coding/flask_dev/venv3/lib/python3.5/site-packages/django/__init__.py", line 22, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
File "/home/sat/coding/flask_dev/venv3/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in __getattr__
self._setup(name)
File "/home/sat/coding/flask_dev/venv3/lib/python3.5/site-packages/django/conf/__init__.py", line 41, in _setup
self._wrapped = Settings(settings_module)
File "/home/sat/coding/flask_dev/venv3/lib/python3.5/site-packages/django/conf/__init__.py", line 110, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/home/sat/coding/flask_dev/venv3/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'django_demo'
populate\u rango.py
包含以下代码:
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings')
import django
django.setup()
from django_demo.rango import models
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings')
import django
django.setup()
from rango import models
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new_django.settings')
import django
django.setup()
from rango.models import
此操作在运行时终止,没有任何错误
新的django项目的settings.py
和rango/apps.py
与对应的django项目具有相同的代码
然而,当我使用来自new_django.rango导入模型的绝对导入像一样引用文档中提到的层次结构new_django/rango
时,我得到了如下回溯:
Traceback (most recent call last):
File "/home/sat/coding/python_dev/oxygen_workspace/new_django/new_django/populate_rango.py", line 12, in <module>
from new_django.rango import models
ImportError: No module named 'new_django.rango'
请有人解释一下原因:
在更新-1中,django.setup()
给出了错误信息
在更新-2中,从rango导入模型导入的没有给出错误,而绝对导入和相对导入没有给出错误
由于Django版本是1.11,您正在使用该版本,并且在Django_演示项目中有manage.py文件,因此项目目录将加载到对此处的任何导入可见的path变量中
查询2
它运行正常,因为rango模块存在于父django_演示的范围内,即加载在路径中的项目文件夹。
查询1
它显示导入错误,因为您有两个同名的django_demo模块,导致双重导入问题。请参阅。
因此,要解决这个问题,请将manage.py移到父项目目录django_demo之外。这样,您的相对导入将顺利工作,因为同名模块将不再冲突
|-- manage.py
/django_demo
|-- __init__.py
|-- populate.py
|-- settings.py
|.....<other modules>
|
|--/django_demo
| |-- __init__.py
| |-- populate_rango.py
| |...<other modules>
|
|--/rango
| |-- __init__.py
| |-- models.py
| |-- apps.py
| |....<other modules>
由于Django版本是1.11,您正在使用该版本,并且在Django_演示项目中有manage.py文件,因此项目目录将加载到对此处的任何导入可见的path变量中
查询2
它运行正常,因为rango模块存在于父django_演示的范围内,即加载在路径中的项目文件夹。
查询1
它显示导入错误,因为您有两个同名的django_demo模块,导致双重导入问题。请参阅。
因此,要解决这个问题,请将manage.py移到父项目目录django_demo之外。这样,您的相对导入将顺利工作,因为同名模块将不再冲突
|-- manage.py
/django_demo
|-- __init__.py
|-- populate.py
|-- settings.py
|.....<other modules>
|
|--/django_demo
| |-- __init__.py
| |-- populate_rango.py
| |...<other modules>
|
|--/rango
| |-- __init__.py
| |-- models.py
| |-- apps.py
| |....<other modules>
这不是我命名它的方式,它是Django项目中遵循的一种标准实践,即拥有一个包含项目(同名)以及所有应用程序文件夹的父文件夹。我只为父文件夹/django\u new
添加了一个\uuuuu init\uuuuuuuuuuuuuuupy
,以避免导入时出现而不是包的错误,从而将重点放在导入时的错误上hand@satvik.t你能告诉我正在使用的dango软件包版本吗?它是Django 1.11,python 3.5。2@satvik.t由于您使用的django版本小于1.4,因此出现了双重导入问题。这不是我给它命名的方式,django项目遵循的标准做法是,有一个包含项目(同名)以及所有应用程序文件夹的父文件夹。我只为父文件夹/django\u new
添加了一个\uuuuu init\uuuuuuuuuuuuuuupy
,以避免导入时出现而不是包的错误,从而将重点放在导入时的错误上hand@satvik.t你能告诉我正在使用的dango软件包版本吗?它是Django 1.11,python 3.5。2@satvik.t由于您使用的django版本小于1.4,因此存在双重导入问题