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,跟随“与django的探戈”

我的项目结构如下:

/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,因此存在双重导入问题