"ImportError: нет модуля с именем jobs.models" с относительным путем

django 1.4,python 2.6.6.
У меня есть приложение "Работа".
дерево моих файлов:

djproject/
|-- djproject
|   |-- db
|   |   `-- tdata.db
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- jobs
|   |   |-- admin.py
|   |   |-- admin.pyc
|   |   |-- __init__.py
|   |   |-- __init__.pyc
|   |   |-- models.py
|   |   |-- models.pyc
|   |   |-- tests.py
|   |   `-- views.py
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   |-- wsgi.py
|   `-- wsgi.pyc
`-- manage.py

мой файл manage.py:

#!/usr/bin/env python

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djproject.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

Затем я запускаю "python manage.py shell", в которой находится папка того же уровня с файлом "manage.py".
И тогда я набираю "из jobs.models import Job".
Ошибки как следует (относительный путь):

>>> from jobs.models import Job
Traceback (most recent call last):
  File "<console>", line 1, in <module>
ImportError: No module named jobs.models

но, если я использую полный путь

>>> from djproject.jobs.models import Job

ошибка исчезает, почему?

3 ответа

Решение

Это как и ожидалось, потому что вы сейчас работаете manage.py из другого каталога, чем в предыдущих версиях Django. См. Обновленный макет проекта по умолчанию и manage.py в документации Django для получения дополнительной информации.

Вы сейчас начинаете manage.py из более высокого каталога в дереве, поэтому вам нужно будет включить djproject при импорте кода. В документации также содержится предложение о том, как сделать это по-другому (если хотите):

Все, что импортируется как модуль верхнего уровня, может быть размещено рядом с новым manage.py. Например, чтобы отделить "myapp" от модуля проекта и импортировать его как просто myapp, поместите его вне каталога mysite/:

manage.py
myapp/
    __init__.py
    models.py
mysite/
    __init__.py
    settings.py
    urls.py

Перемещение manage.py на 1 уровень вниз (внутри djproject/djproject/) должно помочь. Тогда Вы сможете импортировать модули так, как Вы хотите:

from jobs.models import Job
import sys
sys.path.append('/home/python/djproject/djproject')

После того, как я добавляю это в setting.py, он работает.(Как сказано в Internal Server Error.) И я "mv" myapp(jobs) в ту же папку с manage.py, он тоже работает (как сказал Симеон Виссер.)

Другие вопросы по тегам