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.