Django 1.7 löst django.core.exceptions.AppRegistryNotReady aus: Modelle sind noch nicht geladen

166

Dies ist der Traceback auf meinem Windows-System.

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.

Und meine manage.py sieht so aus:

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)

Ich erhalte diesen Fehler, wenn ich versuche, die Registrierungs- App in Django 1.7 zu verwenden

doubleo
quelle
1
Sie haben ein Verzeichnis namens django-django-4c85a0d; 4c85a0dzufällig ein (nicht stabiler) Django-Commit-Hash. Ich glaube nicht, dass Sie tatsächlich Django 1.7 verwenden (siehe meine Antwort)
Kristian Glass
Haben Sie Ihr Problem jemals gelöst?
Nick Spacek
Dies könnte auch damit zusammenhängen venv. Das Neuerstellen des venv-Verzeichnisses hat es für mich behoben. `` `mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r Anforderungen.txt` ``
Thomas - BeeDesk
1
Ich treffe auch einen Fehler wie diesen, wenn ich LOGGING in settings.py auf meinem Mac hinzufüge, weil ich eine Protokolldatei auf /var/log/xx/debug.log erstelle und keine Berechtigung habe, also benutze ich sudo to runserver, und alles ist in Ordnung. Kann einigen Schwulen helfen
gkiwi
Ich habe diesen Fehler beim Ausführen gesehen docker-compose exec .... Das Problem war, dass ich die erforderlichen Umgebungsvariablen nicht an den Befehl docker-compose exec übergeben habe .
Matthew Hegarty

Antworten:

59

Dies hat es für uns und diese Leute gelöst :

Unser Projekt begann mit Django 1.4, wir gingen zu 1.5 und dann zu 1.7. Unsere wsgi.py sah folgendermaßen aus:

import os

from django.core.handlers.wsgi import WSGIHandler

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

Als ich auf den WSGI-Handler im 1.7-Stil aktualisiert habe:

import os

from django.core.wsgi import get_wsgi_application

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

Alles funktioniert jetzt.

Nick Spacek
quelle
1
Ich bin mit der Bearbeitung von @wim nicht einverstanden, nicht weil ich denke, wir sollten den unnötigen Import belassen, sondern weil ich ein Beispiel dafür gegeben habe, wie die automatisch generierte wsgi.py vorher aussah und wie sie nach dem Kopieren aussah die Unterschiede zum 1.7 autogenerierten wsgi.py.
Nick Spacek
1
Die automatisch generierte wsgi.pyDatei enthält niemals eine import sys. Nicht in 1.4, nicht in 1.5 und nicht in 1.7. Wenn Sie es dort hatten, wurde es manuell von jemandem hinzugefügt - es wird nicht von django-admin startproject hinzugefügt.
wim
Gut zu wissen, mein Fehler (und schlechtes Gedächtnis). Es war eine Weile her, seit ich das gemacht hatte, aber ich war mir ziemlich sicher, dass ich zu der Zeit versuchte, das eingebaute Verhalten zu dokumentieren.
Nick Spacek
236

Das Ausführen dieser Befehle hat mein Problem gelöst (Gutschrift für diese Antwort ):

import django
django.setup()

Ich bin mir jedoch nicht sicher, warum ich das brauche. Kommentare wären willkommen.

Nimo
quelle
12
Tut mir leid, ich habe nur nachgedacht, was ich in den Versionshinweisen zu Django 1.7 über das Brechen von Änderungen gelesen habe. docs.djangoproject.com/de/dev/releases/1.7/… . Grundsätzlich hat Django eine neue Möglichkeit, die installierte App zu laden. Wenn Sie Django aus einem Python-Skript laden (wie ich es in meinen benutzerdefinierten Komponententests getan habe), müssen Sie einige Initialisierungen vornehmen, bevor Sie fortfahren und setup () aufrufen. Abgesehen davon, ein großes Lob an das Team, scheint mein Upgrade von 1.6.2 auf 1.7.1 eine Stunde echte Arbeit zu sein.
JL Peyret
12
Wo führe ich den obigen Befehl aus? Ich füge es einer .py-Datei hinzu oder was?
KhoPhi
1
Sie sollten dies in demselben Kontext ausführen, in dem der Fehler auftritt
Nimo
3
Dies hat genug positive Stimmen, um die richtige Antwort zu erhalten
acid_crucifix
Dies löste auch ein Problem, das ich in einem Befehlszeilen-Update-Skript hatte, das bei der Umstellung auf 1.7 fehlschlug.
Jason Champion
58

Das Problem liegt in Ihrer Registrierungs-App. Es scheint , django-Registrierung Anrufe get_user_module()in models.pybei einer Modulebene (bei Modellen nach wie vor durch die Anwendung Registrierungsprozess geladen werden). Dies wird nicht mehr funktionieren:

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

Ich würde diese get_user_model()Modelldatei so ändern, dass sie nur interne Methoden (und nicht auf Modulebene) aufruft und in FKs Folgendes verwendet:

user = ForeignKey(settings.AUTH_USER_MODEL)

Übrigens, der Aufruf von django.setup()sollte in Ihrer manage.pyDatei nicht erforderlich sein , er wird für Sie aufgerufen execute_from_command_line. ( Quelle )

Gonz
quelle
Es if __name__ == '__main__':funktioniert für mich, aber ich weiß nicht, ob es eine gute Lösung ist.
Umair A.
@Neutralizer Ich bin mir nicht sicher, wie du das machst, aber das sollte nicht funktionieren, da Django dieses Modul importiert. Wahrscheinlich vermeiden Sie die zirkuläre Abhängigkeit, indem Sie das Benutzermodell überhaupt nicht importieren.
Gonz
1
Ich meine, setzen Sie diese Zeilen in die Namensprüfung. Möglicherweise wird die Ausführung übersprungen. Ich habe nicht genug Tests gemacht.
Umair A.
18

Ich bin gerade auf das gleiche Problem gestoßen. Das Problem liegt an der django-registrationInkompatibilität mit dem Django 1.7-Benutzermodell.

Eine einfache Lösung besteht darin, diese Codezeilen in Ihrem installierten django-registrationModul zu ändern :

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

zu::

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 

Meins ist bei .venv/local/lib/python2.7/site-packages/registration/models.py(virtualenv)

hagelt
quelle
7
Sie können stattdessen django-register-redux verwenden. Es ist aktualisiert und gewartet Gabel: github.com/macropin/django-registration
TJL
1
django-registration-reduxDas Problem wurde für mich behoben (ich hatte genau den gleichen Stack wie das OP)
Pierre de LESPINAY
1
Falls jemand auf Django 1.8 damit zu kämpfen hatte, gilt dies auch dort.
Andrew Schuster
14

Dies funktioniert bei mir für Django 1.9. Das auszuführende Python-Skript befand sich im Stammverzeichnis des Django-Projekts.

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

Setzen Sie PROJECT_NAME und APP_NAME auf Ihre

Lorenzo Lerate
quelle
1
Für mich geht das. aber ich weiß nicht, warum wir diesen Code ausführen sollen, da wir diese bereits in unserer wsgi-Datei erwähnt haben.
Herr Code
5

Eine andere Option ist, dass Sie einen doppelten Eintrag in INSTALLED_APPS haben. Das warf diesen Fehler für zwei verschiedene Apps, die ich getestet habe. Anscheinend ist es nicht etwas, wonach Django sucht, aber wer ist dann albern genug, um dieselbe App zweimal in die Liste aufzunehmen? Ich, das ist wer.

Kennzeichen
quelle
2

Haben Sie eine virtuelle Python-Umgebung, die Sie eingeben müssen, bevor Sie manage.py ausführen können?

Ich bin selbst auf diesen Fehler gestoßen, und das war das Problem.

Travis
quelle
2

Ich bin auf dieses Problem gestoßen, als ich Djangocms verwendet und ein Plugin hinzugefügt habe (in meinem Fall: Djangocms-Kaskade). Natürlich musste ich das Plugin zu INSTALLED_APPS hinzufügen. Aber die Reihenfolge ist hier wichtig.

Das Platzieren von 'cmsplugin_cascade' vor 'cms' löste das Problem.

pabo
quelle
1
Reihenfolge war wichtig:cms, mptt, menus, sekizai, filer, easy_thumbnails
Blakev
2

Installieren Sie Django-Registrierung-Redux == 1.1 anstelle von Django-Registrierung, wenn Sie Django 1.7 verwenden

user2350206
quelle
0

./manage.py migrate

Dies löste mein Problem

Omar Natour
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. - Aus dem Rückblick
George Z.
@ GeorgeZ. Es sieht aus wie ein Versuch, die Frage zu beantworten, und hat anscheinend das Problem gelöst, als dieses Poster darauf stieß - selbst wenn Sie der Meinung sind, dass es falsch ist oder genauer ausgearbeitet werden sollte, sollte ein echter Versuch, die Frage zu beantworten, nicht aus der Überprüfung gelöscht werden
CertainPerformance
-1

Dein manage.pyist "falsch"; Ich weiß nicht, woher du es hast, aber das ist keine 1.7 manage.py- hast du einen funky Pre-Release-Build verwendet oder so?

Setzen Sie Ihr Gerät manage.pywie unten beschrieben auf das Konventionelle zurück und die Dinge sollten einfach funktionieren:

#!/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)
Kristian Glass
quelle
Ich habe eine manage.py wie diese und ich habe immer noch dieses Problem
rmosolgo