Opened 5 years ago

Closed 5 years ago

Last modified 5 years ago

#26023 closed Bug (invalid)

Importing GenericForeignKey on Django 1.9

Reported by: Chris Mitchell Owned by: nobody
Component: contrib.contenttypes Version: 1.9
Severity: Normal Keywords: generic foreign keys
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Chris Mitchell)

It appears it is not possible to import GenericForeignKey from outside a live Django project in 1.9. To reproduce this error:

from django.conf import settings
settings.configure()
from django.contrib.contenttypes.fields import GenericForeignKey

Produces:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/contrib/contenttypes/fields.py", line 5, in <module>
    from django.contrib.contenttypes.models import ContentType
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/contrib/contenttypes/models.py", line 159, in <module>
    class ContentType(models.Model):
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/db/models/base.py", line 94, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/apps/registry.py", line 239, in get_containing_app_config
    self.check_apps_ready()
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

This seems to be occurring because ModelBase is attempting to get the app config, but the configuration step has not occurred.

Change History (6)

comment:1 Changed 5 years ago by Tim Graham

Could you clarify the use case? You need to have django.contrib.contentypes in INSTALLED_APPS, I believe.

comment:2 Changed 5 years ago by Chris Mitchell

Description: modified (diff)

comment:3 Changed 5 years ago by Chris Mitchell

The case is for the app Wooey and this issue.

We have an option that bootstraps the installation process which entails setting up Django project with pre-determined settings. For compatibility with older versions of Django, there is a compatibility shim to handle cases like GFK's import location being changed and the template engine's get_string method. So at the onset, there is no INSTALLED_APPS. It's a python script importing GFK. I could move these imports to another shim (or do some other workarounds) but this approach works in other Django versions -- although it could entirely be fortunate this behavior was not flagged.

comment:4 Changed 5 years ago by Tim Graham

I'm not sure about fixing the issue in general, but in that case I'd suggest dropping compatibility with Django < 1.8 since those versions are unsupported.

comment:5 Changed 5 years ago by Aymeric Augustin

Resolution: invalid
Status: newclosed

You must call django.setup() as highlighted in the 1.7 release notes.

https://docs.djangoproject.com/en/1.7/releases/1.7/#standalone-scripts

comment:6 Changed 5 years ago by Chris Mitchell

An additional error arises for that case:

>>> from django.conf import settings
>>> settings.configure()
>>> import django
>>> django.setup()
>>> from django.contrib.contenttypes.fields import GenericForeignKey
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/contrib/contenttypes/fields.py", line 5, in <module>
    from django.contrib.contenttypes.models import ContentType
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/contrib/contenttypes/models.py", line 159, in <module>
    class ContentType(models.Model):
  File "/home/chris/.virtualenvs/wooey/local/lib/python2.7/site-packages/django/db/models/base.py", line 103, in __new__
    "application was loaded. " % (module, name))
RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded

I understand this isn't a normal situation. But should importing the GFK field really cause the application loading logic to execute?

Note: See TracTickets for help on using tickets.
Back to Top