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

166

Ceci est le traçage 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'essaye d'utiliser l' application d' enregistrement dans Django 1.7

doubleo
la source
1
Vous avez un répertoire appelé django-django-4c85a0d; 4c85a0dse trouve être un hachage de commit Django (non stable). Je ne crois pas que vous utilisiez réellement Django 1.7 (cf ma réponse)
Kristian Glass
Avez-vous déjà résolu votre problème?
Nick Spacek
Cela pourrait également être lié à venv. La recréation du répertoire venv l'a corrigé pour moi. `` mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r requirements.txt ``
Thomas - BeeDesk
1
Je rencontre également une erreur comme celle-ci lorsque j'ajoute LOGGING dans settings.py sur mon mac, car je crée un fichier journal sur /var/log/xx/debug.log et je n'ai pas l'autorisation, j'utilise donc sudo pour runserver, et tout va bien.Peut aider certains gays
gkiwi
J'ai vu cette erreur lors de l'exécution docker-compose exec .... Le problème était que je ne transmettais pas les variables d'environnement requises à la commande docker-compose exec .
Matthew Hegarty

Réponses:

59

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 à 1.5 puis à 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()

Lorsque 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.

Nick Spacek
la source
1
Je ne suis pas d'accord avec la modification 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 généré automatiquement auparavant, et à quoi il ressemblait après avoir copié les différences avec le wsgi.py 1.7 généré automatiquement.
Nick Spacek du
1
Le wsgi.pyfichier généré automatiquement ne contient jamais de fichier import sys. Ni en 1.4, ni en 1.5, ni en 1.7. Si vous l'aviez là-dedans, il a été ajouté manuellement par quelqu'un - il n'est pas ajouté par django-admin startproject.
wim
Bon à savoir, mon erreur (et ma mauvaise mémoire). Cela faisait un moment que je n'avais pas fait cela, mais j'étais à peu près sûr qu'à l'époque j'essayais de documenter le comportement intégré.
Nick Spacek
236

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

import django
django.setup()

Cependant, je ne sais pas pourquoi j'en ai besoin. Des commentaires seraient appréciés.

Nimo
la source
12
Désolé, je reprends simplement ce que j'ai lu dans les notes de publication de django 1.7 sur les changements de rupture. docs.djangoproject.com/en/dev/releases/1.7/… . Fondamentalement, Django a une nouvelle façon de charger l'application installée. Si vous chargez Django à partir d'un script Python (comme je l'ai été dans mes tests unitaires personnalisés), une certaine initialisation doit être effectuée avant de continuer et appeler setup () est la façon de le faire. En dehors de cela, félicitations à l'équipe, ma mise à niveau 1.6.2 vers 1.7.1 semble valoir une heure de vrai travail.
JL Peyret
12
Où puis-je exécuter la commande ci-dessus? Je l'ajoute à un fichier .py ou quoi?
KhoPhi
1
Vous devez l'exécuter dans le même contexte que l'erreur se produit
Nimo
3
cela a suffisamment de votes pour mériter d'être marqué comme la bonne réponse
acid_crucifix
Cela a également résolu un problème que j'avais dans un script de mise à jour de ligne de commande qui était tombé en panne lors du passage à 1.7.
Jason Champion
58

Le problème se trouve dans votre application d'inscription. Il semble appels django-inscription get_user_module()dans models.pyun niveau du module (lorsque les modèles sont encore chargés par le processus d'enregistrement d'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 de modèles pour appeler uniquement les get_user_model()méthodes internes (et non au niveau du module) et dans les FK, utilisez quelque chose comme:

user = ForeignKey(settings.AUTH_USER_MODEL)

BTW, l'appel à django.setup()ne devrait pas être requis dans votre manage.pyfichier, il est appelé pour vous execute_from_command_line. ( source )

gonz
la source
le mettre à l'intérieur if __name__ == '__main__':fonctionne pour moi mais je ne sais pas si c'est une bonne solution.
Umair A.
@Neutralizer Je ne sais pas comment vous faites cela, mais cela ne devrait pas fonctionner puisque django importe ce module. Vous évitez probablement le dépôt circulaire en n'important pas du tout le modèle utilisateur.
gonz
1
Je veux dire, mettez ces lignes dans la vérification du nom. Cela pourrait sauter l'exécution. Je n'ai pas fait suffisamment de tests.
Umair A.
18

Je viens de rencontrer le même problème. Le problème est qu'il est django-registrationincompatible avec le modèle utilisateur de django 1.7.

Une solution simple consiste à modifier ces lignes de code, au niveau de votre django-registrationmodule installé :

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)

salue
la source
7
Vous pouvez utiliser django-registration-redux à la place. Il est mis à jour et maintenu à jour: github.com/macropin/django-registration
TJL
1
django-registration-reduxa corrigé le problème pour moi (j'avais exactement le même stack que l'OP)
Pierre de LESPINAY
1
Au cas où quelqu'un aurait du mal avec cela sur Django 1.8, cela s'applique également là-bas.
Andrew Schuster
14

Cela fonctionne pour moi pour Django 1.9. Le script Python à exécuter était à 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 sur les vôtres

Lorenzo Lerate
la source
1
Ça marche pour moi. mais je ne sais pas pourquoi nous devrions exécuter ce code comme nous l'avons déjà mentionné dans notre fichier wsgi.
Mr Code
5

Une autre option est que vous avez une entrée en double dans INSTALLED_APPS. Cela a jeté cette erreur pour deux applications différentes que j'ai testées. Apparemment, ce n'est pas quelque chose que Django vérifie, mais alors qui est assez stupide pour mettre la même application dans la liste deux fois. Moi, c'est qui.

marque
la source
2

Avez-vous un environnement virtuel Python que vous devez entrer avant d'exécuter manage.py?

J'ai moi-même rencontré cette erreur, et c'était le problème.

Travis
la source
2

J'ai rencontré ce problème lorsque j'utilise djangocms et que j'ajoute un plugin (dans mon cas: djangocms-cascade). Bien sûr, j'ai dû ajouter le plugin à INSTALLED_APPS. Mais l'ordre est ici important.

Placer «cmsplugin_cascade» avant «cms» a résolu le problème.

pabo
la source
1
la commande importait:cms, mptt, menus, sekizai, filer, easy_thumbnails
blakev
2

installez django-registration-redux == 1.1 à la place de django-registration, si vous utilisez django 1.7

utilisateur2350206
la source
0

./manage.py migrate

Cela a résolu mon problème

Omar Natour
la source
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication. - De l'avis
George Z.
@GeorgeZ. Cela ressemble à une tentative de répondre à la question, et a apparemment résolu le problème lorsque cette affiche l'a rencontré - même si vous pensez que c'est faux ou devrait être élaboré plus, une véritable tentative de répondre à la question ne devrait pas être supprimée de l'examen
CertainPerformance
-1

Votre manage.pyest "faux"; Je ne sais pas d'où vous l'avez obtenu, mais ce n'est pas une 1.7 manage.py- utilisiez-vous une version pré-version géniale ou quelque chose?

Réinitialisez votre manage.pyau conventionnel, comme ci-dessous, et les choses devraient simplement fonctionner:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)
Verre Kristian
la source
J'ai un manage.py comme celui-là et j'ai toujours ce problème
rmosolgo