La estructura del directorio del proyecto Django y la ruta de Python

Estoy tratando de obtener la mejor configuración posible para desarrollar mi proyecto django desde el principio y tengo problemas para que todo funcione bien en la estructura de directorios. He configurado virtualenv’s (env en este ejemplo) para poder implementar un entorno de Python vacío y limpio para cada proyecto de Django.

La estructura básica es la siguiente:

/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 

Este es el diseño básico; Quiero que cada proyecto tenga un directorio para aplicaciones, y en cada aplicación tenga una carpeta separada para modelos, vistas y urls.

El problema que tengo es con la ruta de acceso de python y cómo se manejan los módulos.

Dentro de una aplicación, no quiero tener que referirme al proyecto al importar modelos, es decir, debería usar:

 import appname.models.modelname 

no:

 import projectname.models.modelname 

para ayudar a la reusabilidad

En el directorio de modelos, tengo el siguiente init .py

 from model1 import ModelName1 from model2 import ModelName2 from model3 import ModelName3 __all__ = ['ModelName1', 'ModelName2', 'ModelName3'] 

Pero cuando bash usar un archivo url separado (en /appname/urls/urlfile.py) e importar los modelos como los siguientes:

 from appname.models.somemodel import ModelName 

Recibo un error de “módulo no encontrado”.

mientras:

 from appsfolder.appname.models.somemodel import ModelName 

funciona bien

Supongo que esto se debe a que la aplicación no está directamente en la ruta de acceso de Python, sino que se encuentra en una subcarpeta llamada appsfolder, pero no estoy seguro de cómo solucionar este problema, a la vez que mantengo todo reutilizable y relativo.

Sé que una solución es poner todas las aplicaciones directamente en la ruta de Python debajo de los paquetes de sitio, pero realmente no me gusta esta idea, ya que creo que las aplicaciones deberían estar en el proyecto si está utilizando virtualenv’s

Puede poner lo siguiente en su settings.py para agregar su appsfolder de appsfolder a su PYTHONPATH :

 import os import sys PROJECT_ROOT = os.path.dirname(__file__) sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))