web-dev-qa-db-fra.com

Django 1.7 erreur de mise à niveau: AppRegistryNotReady: les modèles ne sont pas encore chargés

J'essaie de mettre à niveau un projet de Django 1.6 à 1.7. Jusqu'à présent, j'ai créé un nouveau virtualenv avec les mêmes installations et mis à niveau la version Django vers la nouvelle version. Je dois effectuer une mise à niveau à partir de South, mais j'ai rencontré des erreurs lors de cette opération, j'ai donc pensé que je vais d'abord essayer runserver, et je reçois l'erreur suivante:

Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/core/management/__init__.py", line 354, in execute
        Django.setup()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/__init__.py", line 21, in setup
        apps.populate(settings.INSTALLED_APPS)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/apps/registry.py", line 108, in populate
        app_config.import_models(all_models)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/apps/config.py", line 197, in import_models
        self.models_module = import_module(models_module_name)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
        __import__(name)
      File "/Users/Name/Dev/tps/products/models.py", line 127, in <module>
        watson.register(Product.objects.exclude(productimage=None))
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/manager.py", line 92, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/query.py", line 698, in exclude
        return self._filter_or_exclude(True, *args, **kwargs)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/query.py", line 707, in _filter_or_exclude
        clone.query.add_q(~Q(*args, **kwargs))
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/sql/query.py", line 1287, in add_q
        clause, require_inner = self._add_q(where_part, self.used_aliases)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/sql/query.py", line 1314, in _add_q
        current_negated=current_negated, connector=connector)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/sql/query.py", line 1138, in build_filter
        lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/sql/query.py", line 1076, in solve_lookup_type
        _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/sql/query.py", line 1339, in names_to_path
        field, model, direct, m2m = opts.get_field_by_name(name)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/options.py", line 416, in get_field_by_name
        cache = self.init_name_map()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/options.py", line 445, in init_name_map
        for f, model in self.get_all_related_m2m_objects_with_model():
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/options.py", line 563, in get_all_related_m2m_objects_with_model
        cache = self._fill_related_many_to_many_cache()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/db/models/options.py", line 577, in _fill_related_many_to_many_cache
        for klass in self.apps.get_models():
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/utils/lru_cache.py", line 101, in wrapper
        result = user_function(*args, **kwds)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/apps/registry.py", line 168, in get_models
        self.check_models_ready()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/Django/apps/registry.py", line 131, in check_models_ready
        raise AppRegistryNotReady("Models aren't loaded yet.")
    Django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

Avez-vous des idées sur la cause de l'erreur et comment la corriger?

18
Pete Drennan

Le problème vient de cette ligne ("/Users/Name/Dev/tps/products/models.py", ligne 127):

watson.register(Product.objects.exclude(productimage=None))

Vous essayez de référencer un modèle au moment de l'importation. Ce n'est plus possible dans Django 1.7. Django 1.7 vous permet d'utiliser vos modèles uniquement après que toutes les applications sont chargées. Vous devez déplacer cet appel vers le rappel de ready de AppConfig, comme ceci:

from Django.apps import AppConfig


class ProductsConfig(AppConfig):
    name = 'products'

    def ready(self):
        Product = self.get_model('Product')
        watson.register(Product.objects.exclude(productimage=None))

Ensuite, vous devez référencer ce AppConfig dans le __init__.py de votre application products:

default_app_config = 'products.apps.ProductsConfig'

apps est le nom du module où vous placez la configuration.

Pertinent Django doc: https://docs.djangoproject.com/en/dev/ref/applications/

Dans l'ensemble, en raison de ce changement, la migration vers Django 1.7 n'est pas aussi simple que l'on le souhaiterait. Voici quelques conseils de dépannage: https: //docs.djangoproject. com/fr/1.7/ref/applications/# dépannage

22
Vasily Alexeev

J'obtenais cette erreur lorsque j'ai mis à jour mon Django en 1.7. Une chose qui a changé est le fichier wsgi.py qui nécessitait une mise à jour. Voici ma trace:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py", line 93, in handle
    self.handle_request(listener, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py", line 134, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/core/handlers/wsgi.py", line 168, in __call__
    self.load_middleware()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/core/handlers/base.py", line 46, in load_middleware
    mw_instance = mw_class()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/middleware/locale.py", line 23, in __init__
    for url_pattern in get_resolver(None).url_patterns:
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/core/urlresolvers.py", line 372, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/core/urlresolvers.py", line 366, in urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/kpmteam/staging/site/kpm/urls.py", line 7, in <module>
    admin.autodiscover()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/contrib/admin/__init__.py", line 23, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/utils/module_loading.py", line 67, in autodiscover_modules
    for app_config in apps.get_app_configs():
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/apps/registry.py", line 137, in get_app_configs
    self.check_apps_ready()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/Django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
AppRegistryNotReady: Apps aren't loaded yet.

Voici à quoi ressemblait le fichier wsgi.py:

import os
os.environ.setdefault("Django_SETTINGS_MODULE", "settings")
import Django.core.handlers.wsgi
application = Django.core.handlers.wsgi.WSGIHandler()

Et maintenant (en exécutant Django 1.7 avec gunicorn 19.1.0):

import os
os.environ.setdefault("Django_SETTINGS_MODULE", "settings")
from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Changer les deux dernières lignes l'a corrigé. Notez que votre Django_SETTINGS_MODULE peut être différent, généralement c'est "project_name.settings"

15
radtek

Je suis en retard à la fête, mais si vous utilisez Django-registration, vous devrez passer à Django-regitration-redux.

https://pypi.python.org/pypi/Django-registration-redux/

Voir cette réponse: Problème de compatibilité d'enregistrement Django avec Django 1.7

14
wouldnt

J'ai trouvé la solution en faisant:

import Django

Django.setup()

5
julian salas