En mi proyecto Django tengo una aplicación llamada profile
, que en su mayoría contiene mi clase profile.models.UserProfile
para obtener información adicional sobre los objetos User
(puede parecer familiar para la gente de Django). Ahora puse un código de inicialización en profile/__init__.py
(algunas señales) y me encontré con un problema: Django me dice que no se ha encontrado una tabla llamada hotshot_profile
.¿Cómo evito nombrar conflictos dentro del sistema de módulos de Python?
Después de literalmente horas de búsqueda, rastreé el problema hasta el orden de importación. Correr python -v manage.py test
que he encontrado lo siguiente:
import nose.plugins.prof # precompiled from /home/rassie/.virtualenvs/myproject/lib/python2.6/site-packages/nose/plugins/prof.pyc
import hotshot # directory /usr/lib64/python2.6/hotshot
import hotshot # precompiled from /usr/lib64/python2.6/hotshot/__init__.pyc
dlopen("/home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so", 2);
import _hotshot # dynamically loaded from /home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so
import hotshot.stats # from /usr/lib64/python2.6/hotshot/stats.py
import profile # directory /home/rassie/MyProject/apps/profile
import profile # precompiled from /home/rassie/MyProject/apps/profile/__init__.pyc
Así que mi nariz importa el corredor nose.plugins.prof
(aunque este plugin es apagado), las importaciones hotshot
, que intenta importar profile
. Sin embargo, profile
se importa de mi proyecto, mientras que listo debería haberse importado del sistema Python.
Obviamente, mi propio módulo profile
choca con el módulo del sistema profile
. Obviamente no puedo excluir todos los nombres de módulos que viene incluido con Python de mi propia programación. Entonces la pregunta es, ¿a dónde voy desde aquí? ¿Debo crear un espacio de nombre myproject
para todas mis aplicaciones? ¿Funcionará Django con eso?
PD: el nombre de la tabla hotshot_profile
parece venir de un choque de nombres más todavía-a-ser-totalmente analizada con una clase de Profile
pybb
, las cuales yo también estoy usando en mi proyecto. Pero eso está fuera del alcance de esta pregunta.
Siempre pensé que he usado importaciones absolutas siguiendo todos los consejos sobre Django que pude encontrar. Parece que necesito poner mis aplicaciones en un espacio de nombres y luego en una ruta global e importarlas como dices. Veremos si va bien :) –