Я пытаюсь получить наилучшие настройки для разработки моего проекта django с самого начала, и у меня возникают проблемы с тем, чтобы все хорошо воспроизводилось в структуре каталогов. Я настроил virtualenv (env в этом примере), чтобы я мог развернуть чистую пустую среду python для каждого проекта django.
Базовая структура выглядит следующим образом:
/env/
/bin
/db <--- Django DB
/downloads
/lib
/static <--- Where css/imgs/js etc is served from
/project/ <--- Django root
/__init__.py
/settings.py
/manage.py
/appsfolder/
/appname/
/__init__.py
/models/
/__init__.py
/somemodel.py
/urls/
/__init__.py
/someurl.py
/views/
/__init__.py
/someview.py
Это базовая схема; Я хочу, чтобы в каждом проекте был каталог для приложений, а в каждом приложении была отдельная папка для моделей, представлений и URL-адресов.
Проблема, с которой я сталкиваюсь, связана с путем python и тем, как обрабатываются модули.
В приложении я не хочу ссылаться на проект при импорте моделей, т.е. я должен использовать:
import appname.models.modelname
нет:
import projectname.models.modelname
для повторного использования
В каталоге моделей у меня есть следующий init.py
from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3
__all__ = ['ModelName1', 'ModelName2', 'ModelName3']
Но когда я пытаюсь использовать отдельный файл URL (в /appname/urls/urlfile.py) и импортировать модели следующим образом:
from appname.models.somemodel import ModelName
Я получаю сообщение об ошибке «модуль не найден».
пока:
from appsfolder.appname.models.somemodel import ModelName
работает нормально
Я предполагаю, что это связано с тем, что приложение не находится непосредственно на пути к Python, а находится в подпапке с именем appsfolder, но я не уверен, как это исправить, сохраняя при этом все повторное использование и относительность.
Я знаю, что одно из решений состоит в том, чтобы поместить все приложения прямо в путь python под пакетами сайтов, но мне не очень нравится эта идея, так как я думаю, что приложения должны быть в проекте, если вы используете virtualenv