2017-07-29 73 views
1

我學習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> 

我不能夠解決兩個查詢:

查詢1 -

populate_rango.py包含以下代碼:

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings') 

import django 
django.setup() 

from django_demo.rango import models 

models進口是給unresolved import錯誤,即使我使用的是正確的absolute imports符號,累計。到的文檔,以及類似的問題上sibling package imports以及[這裏] [3]

查詢2 -

populate.py/django-demo包包含下面的代碼下:

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_demo.settings') 

import django 
django.setup() 

from rango import models 

從文檔中,必須使用absolute imports虛線符號從子文件夾導入。

上面這段代碼既不使用也不使用。我無法理解

from rango import models 

不會引發未解決的導入錯誤。

注1:我已經包含在INSTALLED_APPS我APPNAME \django_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.pyRangoConfig類:

class RangoConfig(AppConfig): 
name = 'rango' 

注2: 1.我所有的__init__.py文件是空的

    在Ubuntu 我使用的virtualenv與Python 3.5.2作爲PyDev的解釋器+蝕氧

UPDATE-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' 

我不明白這個原因。

UPDATE-2

我創建了一個名爲new_django類似的路線一個新的Django項目,並from rango import models工作在細。

new_django結構:

/new_django 
|-- __init__.py 
|-- manage.py 
|-- populate.py 
|-- settings.py 
|.....<other modules> 
| 
|--/new_django 
| |-- __init__.py 
| |-- populate_rango.py 
| |...<other modules> 
| 
|--/rango 
| |-- __init__.py 
| |-- models.py 
| |-- apps.py 
| |....<other modules> 

populate_rango.py包含以下代碼:

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new_django.settings') 

import django 
django.setup() 

from rango.models import 

此終止而沒有任何錯誤,當運行。

settings.pyrango/apps.pynew_django項目具有相同的代碼作爲其django_demo同行。

然而,當我使用絕對進口from new_django.rango import models,指層次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' 

這也發生在相對情況進口 - from ..rango import models

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 ..rango import models 
SystemError: Parent module '' not loaded, cannot perform relative import 

可能有人請解釋原因:

  1. in UPDATE-1django.setup()給出錯誤?
  2. UPDATE-2,進口from rango import models沒有給一個錯誤,而絕對和相對進口?

回答

0

由於Django的版本是1.11,你正在使用,並具有項目目錄在PATH變量這裏對任何進口可見裝載django_demo項目中manage.py文件。

查詢2 它運行良好,因爲蘭戈模塊,其存在於在PATH加載的父django_demo即項目文件夾的範圍。 查詢1 它顯示導入錯誤,因爲你有2個模塊具有相同名稱的django_demo導致雙導入問題見here
所以解決這個移動你的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> 

我們可以從rango模塊,它是在populate_rango父目錄之外的一個級別導入models.py文件。通過

from django_demo.rango import models 
+0

這PY文件是不是我把它命名,它是一個標準的做法遵循一個Django項目,有一個**父文件夾**含*項目*(同名),以及作爲所有* app *文件夾。 我只爲父'/ django_new'文件夾添加了一個'__init __。py'文件,以避免導入時出現'not a package'錯誤,以便集中處理'import'錯誤 –

+0

@ satvik.t你可以告訴使用的dango包版本嗎? –

+0

它是Django 1.11,python 3.5.2 –