Opened 10 years ago

Closed 10 years ago

Last modified 10 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, 10 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, 10 years ago

Description: modified (diff)

comment:3 by Chris Mitchell, 10 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, 10 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, 10 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, 10 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