Django 1.7 arroja django.core.exceptions.AppRegistryNotReady: los modelos aún no están cargados

166

Este es el rastreo en mi sistema de 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.

Y mi manage.py se ve así:

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)

Recibo este error cuando intento usar la aplicación de registro en Django 1.7

doble
fuente
1
Tienes un directorio llamado django-django-4c85a0d; 4c85a0dresulta ser un hash de confirmación de Django (no estable). No creo que estés usando Django 1.7 (cf mi respuesta)
Kristian Glass
¿Alguna vez resolvió su problema?
Nick Spacek
Esto también podría estar relacionado con venv. La recreación del directorio venv lo arregló para mí. `` `mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r require.txt` ``
Thomas - BeeDesk
1
También encuentro un error como este cuando agrego LOGGING en settings.py en mi mac, esto porque creo un archivo de registro en /var/log/xx/debug.log y no tengo el permiso, así que uso sudo para runserver, y todo está bien. Puede ayudar a algunos gays
gkiwi
Vi este error al ejecutar docker-compose exec .... El problema era que no estaba pasando las variables de entorno requeridas al comando docker-compose exec .
Matthew Hegarty

Respuestas:

59

Esto es lo que lo resolvió para nosotros y estas personas :

Nuestro proyecto comenzó con Django 1.4, pasamos a 1.5 y luego a 1.7. Nuestro wsgi.py se veía así:

import os

from django.core.handlers.wsgi import WSGIHandler

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

Cuando actualicé al controlador WSGI de estilo 1.7:

import os

from django.core.wsgi import get_wsgi_application

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

Todo funciona ahora.

Nick Spacek
fuente
1
No estoy de acuerdo con la edición de @wim, no porque piense que deberíamos dejar la importación innecesaria, sino porque estaba dando un ejemplo de cómo se veía wsgi.py autogenerado antes, y cómo se veía después de haber copiado Las diferencias con el 1.7 autogenerado wsgi.py.
Nick Spacek
1
El wsgi.pyarchivo autogenerado nunca tiene un contenido import sys. No en 1.4, no en 1.5, y no en 1.7. Si lo tenía allí, alguien lo agregó manualmente, no lo agrega django-admin startproject.
wim
Es bueno saberlo, mi error (y mala memoria). Había pasado un tiempo desde que hice esto, pero estaba bastante seguro de que en ese momento estaba tratando de documentar el comportamiento incorporado.
Nick Spacek
236

La ejecución de estos comandos resolvió mi problema (crédito a esta respuesta ):

import django
django.setup()

Sin embargo, no estoy seguro de por qué necesito esto. Comentarios serán apreciados

Nimo
fuente
12
Lo siento, solo repito lo que he leído en las notas de la versión django 1.7 sobre cambios importantes. docs.djangoproject.com/en/dev/releases/1.7/… . Básicamente, Django tiene una nueva forma de cargar la aplicación instalada. Si carga Django desde un script de Python (como estaba en mis pruebas unitarias personalizadas), es necesario realizar algunas inicializaciones antes de continuar y llamar a setup () para saber cómo hacerlo. Además de eso, felicitaciones al equipo, mi actualización 1.6.2 a 1.7.1 parece una hora de trabajo real.
JL Peyret
12
¿Dónde ejecuto el comando anterior? ¿Lo agrego a un archivo .py o qué?
KhoPhi
1
Debe ejecutar esto en el mismo contexto en el que se produce el error
Nimo
3
esto tiene suficientes votos para merecer que se marque la respuesta correcta
acid_crucifix
Esto también resolvió un problema que tenía en un script de actualización de línea de comandos que se rompió en el movimiento a 1.7.
Jason Champion
58

El problema está en su aplicación de registro. Parece llamadas django-registro get_user_module()en models.pya nivel de módulo (cuando los modelos están siendo cargados por el proceso de registro de la aplicación). Esto ya no funcionará:

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

Cambiaría este archivo de modelos para que solo llame a get_user_model()métodos internos (y no a nivel de módulo) y en FK use algo como:

user = ForeignKey(settings.AUTH_USER_MODEL)

Por cierto, la llamada a django.setup()no debería ser necesaria en su manage.pyarchivo, se llama para usted execute_from_command_line. ( fuente )

gonz
fuente
ponerlo dentro if __name__ == '__main__':me funciona, pero no sé si es una buena solución.
Umair A.
@Neutralizer No estoy seguro de cómo lo está haciendo, pero eso no debería funcionar ya que django está importando este módulo. Probablemente esté evitando el depósito circular al no importar el modelo de usuario en absoluto.
gonz
1
Me refiero a poner esas líneas dentro de la verificación de nombre. Podría estar omitiendo la ejecución. No he hecho suficientes pruebas.
Umair A.
18

Acabo de encontrar el mismo problema. El problema es pordjango-registration incompatible con el modelo de usuario django 1.7.

Una solución simple es cambiar estas líneas de código, en su django-registrationmódulo instalado ::

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

a::

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 

El mío está en .venv/local/lib/python2.7/site-packages/registration/models.py(virtualenv)

granizo
fuente
77
Puede usar django-Registration-Redux en su lugar. Se actualizó y mantuvo fork: github.com/macropin/django-registration
TJL
1
django-registration-reduxme arregló el problema (tenía exactamente la misma pila que el OP)
Pierre de LESPINAY
1
En caso de que alguien tuviera problemas con esto en Django 1.8, también se aplica allí.
Andrew Schuster
14

Esto funciona para mí para Django 1.9. El script Python a ejecutar estaba en la raíz del proyecto Django.

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

Establezca PROJECT_NAME y APP_NAME en el suyo

Lorenzo Lerate
fuente
1
Esto funciona para mi. pero no sé por qué deberíamos ejecutar este código ya que ya lo mencionamos en nuestro archivo wsgi.
Mr Code,
5

Otra opción es que tiene una entrada duplicada en INSTALLED_APPS. Eso arrojó este error para dos aplicaciones diferentes que probé. Aparentemente, no es algo que Django busca, pero quién es lo suficientemente tonto como para poner la misma aplicación en la lista dos veces. Yo, ese es quien.

marca
fuente
2

¿Tiene un entorno virtual de Python que necesita ingresar antes de ejecutar manage.py?

Me encontré con este error yo mismo, y ese fue el problema.

Travis
fuente
2

Me encontré con este problema cuando uso djangocms y agregué un complemento (en mi caso: djangocms-cascade). Por supuesto, tuve que agregar el complemento a INSTALLED_APPS. Pero el orden aquí es importante.

Para colocar 'cmsplugin_cascade' antes de que 'cms' resolviera el problema.

pabo
fuente
1
orden importó:cms, mptt, menus, sekizai, filer, easy_thumbnails
blakev
2

instale django-Registration-Redux == 1.1 en lugar de django-Registration, si está utilizando django 1.7

usuario2350206
fuente
0

./manage.py migrate

Esto resolvió mi problema

Omar Natour
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. - De la opinión
George Z.
@GeorgeZ. Parece un intento de responder la pregunta, y aparentemente resolvió el problema cuando este póster se encontró con él, incluso si cree que está mal o debe elaborarse más, un intento genuino de responder la pregunta no debe eliminarse de la revisión
CertainPerformance
-1

Tu manage.pyestá "equivocado"; No sé de dónde lo sacaste, pero eso no es un 1.7manage.py : ¿estabas usando alguna versión pre-lanzamiento original o algo así?

Restablezca su configuración manage.pyconvencional, como se muestra a continuación, y las cosas deberían funcionar:

#!/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
fuente
Tengo un manage.py como ese y todavía tengo este problema
rmosolgo