O Django 1.7 lança django.core.exceptions.AppRegistryNotReady: os modelos ainda não foram carregados


166

Este é o rastreio no meu sistema 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.

E o meu manage.py fica assim:

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)

Eu recebo esse erro quando estou tentando usar o aplicativo de registro no Django 1.7


1
Você tem um diretório chamado django-django-4c85a0d; 4c85a0dpassa a ser um hash de commit do Django (não estável). Eu não acredito que você está realmente usando Django 1.7 (cf minha resposta)
Kristian Vidro

Você já resolveu seu problema?
Nick Spacek

Isso também pode estar relacionado a venv. A recriação do diretório venv o corrigiu para mim. `` `` mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r requirements.txt ``
Thomas - BeeDesk

1
Também encontro algum erro como este quando adiciono LOGGING em settings.py no meu mac, isso porque crio um arquivo de log em /var/log/xx/debug.log e não tenho permissão, então uso o sudo para runserver, e Ouvia é fine.May ajuda alguns gays
gkiwi

Eu vi esse erro ao executar docker-compose exec .... O problema era que eu não estava passando as variáveis ​​de ambiente necessárias para o comando docker-compose exec .
Matthew Hegarty

Respostas:


59

Isto é o que resolveu para nós e essas pessoas :

Nosso projeto começou com o Django 1.4, fomos para 1.5 e depois para 1.7. Nosso wsgi.py ficou assim:

import os

from django.core.handlers.wsgi import WSGIHandler

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

Quando eu atualizei para o manipulador WSGI do estilo 1.7:

import os

from django.core.wsgi import get_wsgi_application

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

Tudo funciona agora.


1
Não concordo com a edição do @wim, não porque acho que devemos deixar a importação desnecessária, mas porque estava dando um exemplo de como era o wsgi.py com geração automática antes e como era depois de copiar as diferenças do wsgi.py 1.7 gerado automaticamente.
Nick Spacek

1
O wsgi.pyarquivo gerado automaticamente nunca possui um import sys. Nem no 1.4, nem no 1.5, nem no 1.7. Se você o tinha lá, foi adicionado manualmente por alguém - não foi adicionado pelo django-admin startproject.
Wim

É bom saber, meu erro (e falta de memória). Fazia um tempo desde que eu fiz isso, mas eu tinha quase certeza de que na época eu estava tentando documentar o comportamento incorporado.
Nick Spacek

236

A execução desses comandos resolveu meu problema (crédito a esta resposta ):

import django
django.setup()

No entanto, não sei por que preciso disso. Comentários seriam apreciados.


12
Desculpe, basta repetir o que li nas notas de lançamento do django 1.7 sobre as alterações mais recentes. docs.djangoproject.com/en/dev/releases/1.7/… . Basicamente, o Django tem uma nova maneira de carregar o aplicativo instalado. Se você carrega o Django a partir de um script Python (como eu estava em meus testes de unidade personalizados), alguma inicialização precisa ser feita antes de prosseguir e chamar setup () é como fazê-lo. Além disso, parabéns à equipe, minha atualização de 1.6.2 para 1.7.1 parece uma hora de trabalho real.
JL Peyret

12
Onde eu executo o comando acima? Eu o adiciono a um arquivo .py ou o quê?
KhoPhi

1
Você deve executar isso no mesmo contexto em que o erro ocorre
Nimo

3
isso tem upvotes o suficiente para merecer ser marcada a resposta correta
acid_crucifix

Isso também resolveu um problema que tive em um script de atualização da linha de comando que foi interrompido na mudança para a 1.7.
Jason Champion

58

O problema está no seu aplicativo de registro. Parece que o django-registration chama get_user_module()no models.pynível do módulo (quando os modelos ainda estão sendo carregados pelo processo de registro do aplicativo). Isso não funcionará mais:

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

Eu mudaria esse arquivo de modelos para chamar apenas get_user_model()métodos internos (e não no nível do módulo) e nos FKs use algo como:

user = ForeignKey(settings.AUTH_USER_MODEL)

BTW, a chamada para django.setup()não deve ser necessária em seu manage.pyarquivo, é chamada para você execute_from_command_line. ( fonte )


colocá-lo dentro if __name__ == '__main__':funciona para mim, mas não sei se é uma boa solução.
Umair A.

@ Neutralizer Não tenho certeza de como você está fazendo isso, mas isso não deve funcionar, pois o django está importando este módulo. Provavelmente, você está evitando o depósito circular ao não importar o modelo do usuário.
gonz

1
Quero dizer, coloque essas linhas dentro da verificação de nome. Pode estar pulando a execução. Eu não fiz testes suficientes.
Umair A.

18

Acabei de encontrar o mesmo problema. O problema é django-registrationincompatível com o modelo de usuário do django 1.7.

Uma correção simples é alterar essas linhas de código, no seu 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  

para::

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 

O meu está em .venv/local/lib/python2.7/site-packages/registration/models.py(virtualenv)


7
Você pode usar o django-registration-redux. Ele é atualizado e mantido em fork: github.com/macropin/django-registration
TJL

1
django-registration-reduxcorrigiu o problema para mim (eu tinha exatamente a mesma pilha como o OP)
Pierre de LESPINAY

1
Caso alguém esteja lutando com isso no Django 1.8, isso também se aplica a ele.
Andrew Schuster

14

Isso funciona para mim no Django 1.9. O script Python a ser executado estava na raiz do projeto Django.

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

Defina PROJECT_NAME e APP_NAME para o seu


1
Funciona para mim. mas não sei por que devemos executar esse código, como já mencionamos no nosso arquivo wsgi.
Sr. Code

5

Outra opção é que você tenha uma entrada duplicada em INSTALLED_APPS. Isso gerou esse erro para dois aplicativos diferentes que testei. Aparentemente, não é algo que o Django verifique, mas quem é bobo o suficiente para colocar o mesmo aplicativo na lista duas vezes. Eu sou quem.


2

Você tem um ambiente virtual Python em que precisa entrar antes de executar o manage.py?

Eu mesmo encontrei esse erro, e esse era o problema.


2

Corri para esse problema quando uso djangocms e adicionei um plug-in (no meu caso: djangocms-cascade). Claro que tive que adicionar o plugin ao INSTALLED_APPS. Mas a ordem aqui é importante.

Para colocar 'cmsplugin_cascade' antes de 'cms' resolver o problema.


1
a ordem importava:cms, mptt, menus, sekizai, filer, easy_thumbnails
blakev

2

instale o django-registration-redux == 1.1 em vez do django-registration, se você estiver usando o django 1.7


0

./manage.py migrate

Isso resolveu meu problema


Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem. - Da avaliação
George Z.

@GeorgeZ. Parece uma tentativa de responder à pergunta e aparentemente resolveu o problema quando este pôster apareceu - mesmo que você ache errado ou deva ser mais elaborado, uma tentativa genuína de responder à pergunta não deve ser excluída da revisão
CertainPerformance

-1

Você manage.pyestá "errado"; Eu não sei de onde você tirou, mas isso não é um 1.7manage.py - você estava usando alguma versão funky de pré-lançamento ou algo assim?

Redefina o seu manage.pypara o convencional, como abaixo, e as coisas devem 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)

Eu tenho um manage.py como aquele e eu ainda tem esse problema
rmosolgo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.