Opened 8 years ago

Closed 8 years ago

Last modified 8 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 by Tim Graham, 8 years ago

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

comment:2 by Chris Mitchell, 8 years ago

Description: modified (diff)

comment:3 by Chris Mitchell, 8 years ago

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 by Tim Graham, 8 years ago

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 by Aymeric Augustin, 8 years ago

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 by Chris Mitchell, 8 years ago

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