Search code examples
djangopython-3.xrelative-importcookiecutter

Django relative import from external app


I'm a 2 Scoops of Django 1.8 reader. Chapter 29 (what about those random utilities) suggests to create a core app to store commonly used code. It also suggests that you can use this syntax to import code from it:

e.g.

from core.models import TimeStampedModel

How ever it seems that this relative import does not work. I'm using cookiecutter-django and I needed to do:

from projectname.apps.core.models import TimeStampedModel

I tried adding my APPS_DIR to the path:

sys.path.insert(str(APPS_DIR))

But that resulted in import conflicts given that now there were 2 modules with the same name, new_app and projectname.apps.new_app.

I just want to avoid explicit imports. Is there a way to include the Installed Apps in the python path without creating import conflicts? what are best practices regarding external apps imports?

edit: adds project structure

.
├── README.rst
├── manage.py
├── config
│   ├── __init__.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── common.py
│   │   ├── local.py
│   │   ├── test.py
│   │   ├── production.py
│   │   └── staging.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── projectname
│   ├── __init__.py
│   ├── apps
│   │   ├── __init__.py
│   │   ├── core
│   │   │   └── __init__.py
│   │   └── new_app
│   │       └── __init__.py
│   ├── static
│   │   └── ...
│   └── templates
│       └── ...
├── requirements
│   ├── base.txt
│   ├── local.txt
│   ├── production.txt
│   └── test.txt
└── tests
    └── ...

Solution

  • If you want to use relative imports you need to import it this way

    from .core.models import TimeStampedModel

    This would take the relative path from which the code is being executed, unlike absolute imports which are not supported in Django 1.8