title: (django) Why do I get an error when adding app to INSTALLED_APPS but not when just importing?
body: <p>I wrote an app with abstract classes, some utils functions, my common template tags and so on.</p>
  
  <p>Somewere I saw it's recommended way to do this stuff to a reusable app. (It's all related to each other.) Why not? It seems to be a good idea. So I made the stuff being part of an app. Since that app has no urls, views and not the normal structur, it's more like a python module. (But it needs django.)</p>
  
  <hr>
  
  <p>When I import this app the normal way (with <code>import myapp</code> on top of the files) it works fine.</p>
  
  <p>Looking for bestpractice I saw in the official django tutorial part 8 that's recommended to import apps in <code>INSTALLED_APPS</code> in <code>settings.py</code>. Since I made my utils module being an app I thought I could just add a line to <code>INSTALLED_APPS</code>. Just like this: <code>myapp.apps.MyappConfig</code>.</p>
  
  <p>My project structure:</p>
  
  <pre><code>project
  |-... [multiple normal apps]
  |-myapp [which is my utils app]
  |-project [the inner folder]
  |-... [some other stuff]
  </code></pre>
  
  <p>As you can see, <code>myapp</code>, the utils app, is still part of the project (and hasn't been made a reusable app yet.)</p>
  
  <hr>
  
  <p>But when I add that line to <code>INSTALLED_APPS</code> I get the following traceback:</p>
  
  <pre><code>Unhandled exception in thread started by &lt;function check_errors.&lt;locals&gt;.wrapper at 0xb6356adc&gt;
  Traceback (most recent call last):
    File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
      fn(*args, **kwargs)
    File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/runserver.py", line 117, in inner_run
      autoreload.raise_last_exception()
    File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 250, in raise_last_exception
      six.reraise(*_exception)
    File "/usr/local/lib/python3.5/dist-packages/django/utils/six.py", line 685, in reraise
      raise value.with_traceback(tb)
    File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
      fn(*args, **kwargs)
    File "/usr/local/lib/python3.5/dist-packages/django/__init__.py", line 27, in setup
      apps.populate(settings.INSTALLED_APPS)
    File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 85, in populate
      app_config = AppConfig.create(entry)
    File "/usr/local/lib/python3.5/dist-packages/django/apps/config.py", line 94, in create
      module = import_module(entry)
    File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
      return _bootstrap._gcd_import(name[level:], package, level)
    File "&lt;frozen importlib._bootstrap&gt;", line 986, in _gcd_import
    File "&lt;frozen importlib._bootstrap&gt;", line 969, in _find_and_load
    File "&lt;frozen importlib._bootstrap&gt;", line 944, in _find_and_load_unlocked
    File "&lt;frozen importlib._bootstrap&gt;", line 222, in _call_with_frames_removed
    File "&lt;frozen importlib._bootstrap&gt;", line 986, in _gcd_import
    File "&lt;frozen importlib._bootstrap&gt;", line 969, in _find_and_load
    File "&lt;frozen importlib._bootstrap&gt;", line 944, in _find_and_load_unlocked
    File "&lt;frozen importlib._bootstrap&gt;", line 222, in _call_with_frames_removed
    File "&lt;frozen importlib._bootstrap&gt;", line 986, in _gcd_import
    File "&lt;frozen importlib._bootstrap&gt;", line 969, in _find_and_load
    File "&lt;frozen importlib._bootstrap&gt;", line 958, in _find_and_load_unlocked
    File "&lt;frozen importlib._bootstrap&gt;", line 673, in _load_unlocked
    File "&lt;frozen importlib._bootstrap_external&gt;", line 665, in exec_module
    File "&lt;frozen importlib._bootstrap&gt;", line 222, in _call_with_frames_removed
    File "/my_cool_directory/project/myapp/__init__.py", line 1, in &lt;module&gt;
      from .models import *
    File "/my_cool_directory/project/myapp/models.py", line 8, in &lt;module&gt;
      class Publishable(models.Model):
    File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 110, in __new__
      app_config = apps.get_containing_app_config(module)
  </code></pre>
  
  <hr>
  
  <pre><code>  File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 247, in get_containing_app_config
      self.check_apps_ready()
    File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 125, in check_apps_ready
      raise AppRegistryNotReady("Apps aren't loaded yet.")
  django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
  </code></pre>
  
  <hr>
  
  <p>It's not like I have I serious problem because I can import the app the normal way. I'm just curious: Why isn't it working the recommended way?</p>
  
  <hr>
  
  <ul>
  <li>And: how to make things in submodules to be importable from topmodule? In apps.py? Or in <code>__init__.py</code>?</li>
  </ul>