Django app and a submodule name conflict

400 views
Skip to first unread message

Vahe Evoyan

unread,
Jun 4, 2014, 3:51:28 AM6/4/14
to django...@googlegroups.com

I have modules in the project with the same names, all placed in different applications.

Particularly there are two apps that conflict and result an ImportError. The project structure approximately is as follows.

project
 |_ project   
   |_ settings.py
   |_ ...
 |_ apps
   |_ A
     |_ handlers
       |_ B.py
       |_ C.py
   |_ B
     |_ models.py

The settings file adds apps directory to the system path.

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, os.path.join(BASE_DIR, "apps"))

This configuration assumes that when I import the B.models it will use apps/B/models.py. Although the following line in the C.py file raise an import error as it imports the A/handlers/B.pywhich does not have models module.

A/handlers/C.py:
    from B.models import BModel

The sys.path variable has a correct items, i.e. the first one in the list is /path/to/project/appsand sys.modules['B.models'] is referenced to the correct file.

BTW, when I use Django's import_by_path function, everything works fine.

Any ideas how I can solve the problem without renaming the modules?

Posted sample sources on GitHub.

Thanks in advance!

Joseph Catrambone

unread,
Jun 4, 2014, 3:19:50 PM6/4/14
to django...@googlegroups.com
It may be worth trying a relative import, depending on which version of Python you're using.  I believe you can do "from .B.models import BModel".  Note the '.' full-stop/period before the module.  I can't promise that will fix your problem, as the layout isn't entirely clear to me, but it might get you on the right track.

Vahe Evoyan

unread,
Jun 5, 2014, 1:49:31 AM6/5/14
to django...@googlegroups.com
It currently works as you describe: "from .B.models import BModel", but I need it to work like "from ...B.models import BModel" to import apps/B/models.py module. The problem with "..." is that apps directory is not a module (i.e. there is no __init__.py file). The app directory is the first one in the sys.path list, so the simple "from B.models import BModel" should look in apps/B/models.py file, but it looks into current directory earlier than app directory.

This structure perfectly works with a simple python scripts (without Django included), that's why I suspect that Django hooks something in the import procedure.

Tom Evans

unread,
Jun 5, 2014, 9:12:53 AM6/5/14
to django...@googlegroups.com
The simplest solution is to simply rename either app or component that
conflicts.

Cheers

Tom

Vahe Evoyan

unread,
Jun 6, 2014, 8:13:57 AM6/6/14
to django...@googlegroups.com, teva...@googlemail.com
Thanks Tom,

Did something similar: added app/ directory as a module, so now all my imports look like app.A.
Reply all
Reply to author
Forward
0 new messages