Ошибка импорта Django, когда приложения с одинаковым именем

Структура моего проекта django:

project
    book (an app)
        __init__.py
        views.py
        models.py
        urls.py
        ...
    api (an app)
        __init__.py
        problem.py
        book (another app for REST API)
            __init__.py
            views.py
            urls.py
            ...

Когда я пытаюсь «из book.models import *» в api/problem.py, django сказал «ImportError: No module named models». Я думаю, это потому, что он пытается импортировать «api/book/models.py», которого не существует. Как я могу импортировать модули из корневой папки? Спасибо.


person iForests    schedule 19.08.2012    source источник
comment
Не используйте import *, это может привести к конфликтам. Импортирует только то, что вам нужно. Сначала убедитесь, что __init__ существует для каждой папки, которую вы собираетесь импортировать. Вам не нужно отдельное приложение для api. Просто сделайте api.py в book (и любое другое приложение, которое вы собираетесь сделать, для которого требуется общедоступный API.   -  person CppLearner    schedule 19.08.2012
comment
На самом деле я совсем запутался. Из какого models вы хотите импортировать? Первый book's models.py или api/book/<models.py> ? Если последний случай, то да, вам определенно не хватает моделей. Но если вы не можете импортировать из первого случая, убедитесь, что __init__ есть, и попробуйте импортировать из project.book.models import some_class, поскольку вы заметили, что он пытается импортировать локальную версию книги.   -  person CppLearner    schedule 19.08.2012
comment
Это первый случай. В project/book/ есть init.py, и я могу импортировать из book.models *, когда использую оболочку python manage.py, но не в project/api/problem.py. Еще нужна помощь, спасибо!   -  person iForests    schedule 19.08.2012
comment
Не могли бы вы отредактировать свой пост и сообщить нам все необходимые файлы (включая __init__.py? Странно, что from project.book.models import some_class не работает.   -  person CppLearner    schedule 20.08.2012
comment
ХОРОШО. В папке проекта нет файла init.py.   -  person iForests    schedule 20.08.2012
comment
Попробуйте поместить файл инициализации в папку проекта? И делай то, что я говорю тебе попробовать...   -  person CppLearner    schedule 20.08.2012


Ответы (3)


Если вы очень отчаялись, вы можете попробовать это.

from django.contrib.contenttypes.models import ContentType
model_ct = ContentType.objects.get(app_label="book", model="some_model_you_gonna_import")
target_model = model_ct.model_class()

Таким образом, вы сможете получить класс, который вам может понадобиться. (используя target_model как ту, которую вы собираетесь импортировать)

Кстати, я пробовал это. должно сработать. :п

person tic    schedule 19.08.2012

Мое решение состояло бы в том, чтобы очистить структуру проекта, чтобы вместо api.book было book.api.

Например, структурируйте свой проект следующим образом:

project
    book (an app)
        views.py
        models.py
        urls.py
        api (another app for REST API)
            views.py
            urls.py
            ...
        ...
    api (an app)
        __init__.py
        problem.py
        ...
person Kimvais    schedule 19.08.2012
comment
Вы имели в виду, что у вас есть папка API в каждом приложении? - person iForests; 19.08.2012
comment
Да, но нет. Я пересмотрю ответ, чтобы объяснить - person Kimvais; 19.08.2012

Вы можете попробовать относительный импорт, ссылки PEP 328

# in api.problem.py
from ..book.models import something

Этот стиль не рекомендуется, но он помогает, если рефакторинг структур и имен пакетов вызывает затруднения.

person okm    schedule 19.08.2012
comment
Все еще нет модуля с именем book.models - person iForests; 19.08.2012
comment
Как выглядит ваш sys.path? Вы получили это в оболочке, а не в manage.py run? - person okm; 19.08.2012