169 votes

Django 1.7 lance django.core.exceptions.AppRegistryNotReady : Les modèles ne sont pas encore chargés

Voici le résultat de la recherche sur mon système Windows.

Traceback (most recent call last):
  File "D:\AMD\workspace\steelrumors\manage.py", line 9, in <module>
    django.setup()
  File "D:\AMD\Django\django-django-4c85a0d\django\__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\config.py", line 197, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
    __import__(name)
  File "C:\Python27\lib\site-packages\registration\models.py", line 15, in <module>
    User = get_user_model()
  File "D:\AMD\Django\django-django-4c85a0d\django\contrib\auth\__init__.py", line 135, in get_user_model
    return django_apps.get_model(settings.AUTH_USER_MODEL)
  File "D:\AMD\Django\django-django-4c85a0d\django\apps\registry.py", line 199, in get_model
    self.check_models_ready()
  File "D:\AMD\Django\django-django-4c85a0d\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.

Et mon manage.py ressemble à ceci :

import os
import sys
import django

if __name__ == "__main__":

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "steelrumors.settings")
    django.setup()
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

J'obtiens cette erreur lorsque j'essaie d'utiliser inscription application en Django 1.7

1 votes

Vous avez un répertoire appelé django-django-4c85a0d ; 4c85a0d se trouve être un hash de commit Django (non stable). Je ne pense pas que vous utilisiez réellement Django 1.7 (cf. ma réponse).

0 votes

Avez-vous résolu votre problème ?

0 votes

Cela pourrait également être lié à venv . Recréer le répertoire venv a réglé le problème pour moi. ``` mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r requirements.txt ```

236voto

Nimo Points 527

L'exécution de ces commandes a résolu mon problème (crédit à cette réponse ):

import django
django.setup()

Cependant, je ne suis pas sûr de savoir pourquoi j'en ai besoin. Vos commentaires seraient les bienvenus.

12 votes

Désolé, je ne fais que répéter ce que j'ai lu dans les notes de mise à jour de la version 1.7 de Django à propos des changements de rupture. docs.djangoproject.com/fr/dev/releases/1.7/ . En fait, Django a une nouvelle façon de charger les applications installées. Si vous chargez Django à partir d'un script Python (comme je l'ai fait dans mes tests unitaires personnalisés), une certaine initialisation doit être effectuée avant de poursuivre et l'appel à setup() est la façon de le faire. À part cela, bravo à l'équipe, ma mise à niveau de 1.6.2 à 1.7.1 semble être une heure de travail réel.

13 votes

Où dois-je exécuter la commande ci-dessus ? Je l'ajoute à un fichier .py ou quoi ?

1 votes

Vous devez exécuter cette opération dans le même contexte que celui où l'erreur se produit.

60voto

Nick Spacek Points 1098

C'est ce qui a résolu le problème pour nous et ces gens :

Notre projet a commencé avec Django 1.4, nous sommes passés à la 1.5 puis à la 1.7. Notre wsgi.py ressemblait à ceci :

import os

from django.core.handlers.wsgi import WSGIHandler

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = WSGIHandler()

Quand j'ai mis à jour le gestionnaire WSGI de style 1.7 :

import os

from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()

Tout fonctionne maintenant.

1 votes

Je ne suis pas d'accord avec l'édition de @wim, non pas parce que je pense que nous devrions laisser l'importation inutile, mais parce que je donnais un exemple de ce à quoi ressemblait le wsgi.py autogénéré avant, et ce à quoi il ressemblait après que j'ai copié les différences du wsgi.py autogénéré de la version 1.7.

1 votes

Le fichier autogénéré wsgi.py n'a jamais de import sys en elle. Ni dans la 1.4, ni dans la 1.5, ni dans la 1.7. Si c'est le cas, c'est qu'il a été ajouté manuellement par quelqu'un - il n'est pas ajouté par django-admin startproject.

0 votes

C'est bon à savoir, mon erreur (et ma mauvaise mémoire). Cela faisait un moment que je n'avais pas fait cela, mais j'étais presque sûr qu'à l'époque, j'essayais de documenter le comportement intégré.

58voto

gonz Points 974

Le problème se situe dans votre application d'enregistrement. Il semble que django-registration appelle get_user_module() en models.py au niveau du module (lorsque les modèles sont encore chargés par le processus d'enregistrement de l'application). Cela ne fonctionnera plus :

try:
    from django.contrib.auth import get_user_model
    User = get_user_model()
except ImportError:
    from django.contrib.auth.models import User    

Je changerais ce fichier modèle pour qu'il n'appelle que get_user_model() à l'intérieur des méthodes (et non au niveau du module) et dans les FKs utiliser quelque chose comme :

user = ForeignKey(settings.AUTH_USER_MODEL)

D'ailleurs, l'appel à django.setup() ne devrait pas être nécessaire dans votre manage.py il est appelé pour vous dans execute_from_command_line . ( fuente )

0 votes

Le mettre à l'intérieur if __name__ == '__main__': fonctionne pour moi mais je ne sais pas si c'est une bonne solution.

0 votes

@Neutralizer Je ne sais pas exactement comment vous procédez, mais cela ne devrait pas fonctionner puisque django importe ce module. Vous évitez probablement l'erreur circulaire en n'important pas du tout le modèle User.

1 votes

Je veux dire mettre ces lignes dans le contrôle des noms. Il se peut qu'il saute l'exécution. Je n'ai pas fait assez de tests.

19voto

hails Points 199

Je viens de rencontrer le même problème. Le problème est dû à django-registration incompatible avec le modèle d'utilisateur de django 1.7.

Une solution simple consiste à modifier les lignes de code suivantes, dans votre installation django-registration module : :

try:
    from django.contrib.auth import get_user_model
    User = get_user_model()
except ImportError:
    from django.contrib.auth.models import User  

à: :

from django.conf import settings
try:
    from django.contrib.auth import get_user_model
    User = settings.AUTH_USER_MODEL
except ImportError:
    from django.contrib.auth.models import User 

Le mien est à .venv/local/lib/python2.7/site-packages/registration/models.py (virtualenv)

7 votes

Vous pouvez utiliser django-registration-redux à la place. Il est mis à jour et maintenu en fork : github.com/macropin/django-registration

1 votes

django-registration-redux a résolu le problème pour moi (j'avais exactement la même pile que l'OP)

1 votes

Au cas où quelqu'un aurait eu des difficultés avec Django 1.8, cela s'applique également à cette version.

14voto

Lorenzo Lerate Points 961

Cela fonctionne pour moi pour Django 1.9 . Le script Python à exécuter était dans la racine du projet Django.

    import django 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings")
    django.setup()
    from APP_NAME.models import *

Définissez PROJECT_NAME et APP_NAME à votre nom.

1 votes

Cela fonctionne pour moi, mais je ne sais pas pourquoi nous devrions exécuter ce code car nous avons déjà mentionné ces éléments dans notre fichier wsgi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X