Django 1.7 throws django.core.exceptions.AppRegistryNotReady: модели еще не загружены

153

Это трассировка в моей системе 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.

И мой manage.py выглядит так:

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)

Я получаю эту ошибку, когда пытаюсь использовать registration приложение в Django 1.7

  • 1
    У вас есть каталог с именем django-django-4c85a0d ; 4c85a0d оказывается (нестабильным) хешем коммитов Django. Я не верю, что вы на самом деле используете Django 1.7 (см. Мой ответ)
  • 0
    Вы когда-нибудь решали свою проблему?
Показать ещё 2 комментария
Теги:

10 ответов

54
Лучший ответ

Это то, что разрешило это для нас и этих людей:

Наш проект начался с Django 1.4, мы отправились в 1.5, а затем в 1.7. Наш wsgi.py выглядел так:

import os

from django.core.handlers.wsgi import WSGIHandler

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

Когда я обновил обработчик WSGI в стиле 1.7:

import os

from django.core.wsgi import get_wsgi_application

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

Теперь все работает.

  • 1
    Я не согласен с правкой @wim не потому, что я думаю, что мы должны оставить ненужный импорт, а потому, что я приводил пример того, как выглядел автоматически сгенерированный wsgi.py и как он выглядел после того, как я скопировал отличия от 1,7 автоматически сгенерированные wsgi.py.
  • 1
    В wsgi.py файле wsgi.py никогда не будет wsgi.py import sys . Не в 1.4, не в 1.5 и не в 1.7. Если он у вас был, он был добавлен кем-то вручную - он не добавлен стартовым проектом django-admin.
Показать ещё 1 комментарий
212

Выполнение этих команд решило мою проблему (кредит этот ответ):

import django
django.setup()

Однако я не уверен, зачем мне это нужно. Комментарии будут оценены.

  • 12
    Извините, просто попугаю то, что я прочитал в заметках о выпуске django 1.7 о критических изменениях. docs.djangoproject.com/en/dev/releases/1.7/… . В основном, у Django появился новый способ загрузки установленного приложения. Если вы загружаете Django из скрипта Python (как я делал в моих пользовательских модульных тестах), перед продолжением необходимо выполнить некоторую инициализацию, и вызов метода setup () - как это сделать. Кроме того, спасибо команде, мое обновление с 1.6.2 до 1.7.1 кажется часом реальной работы.
  • 7
    Где я могу запустить вышеуказанную команду? Я добавляю его в файл .py или как?
Показать ещё 6 комментариев
57

Проблема в вашем приложении регистрации. Кажется, django-registration вызывает get_user_module() в models.py на уровне модуля (когда модели все еще загружаются процессом регистрации приложения). Это больше не будет работать:

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

Я бы изменил этот файл моделей только для вызова get_user_model() внутри методов (а не на уровне модуля), а в FK используйте что-то вроде:

user = ForeignKey(settings.AUTH_USER_MODEL)

BTW, вызов django.setup() не требуется в вашем файле manage.py, он вызвал вас в execute_from_command_line. (источник)

  • 0
    положить его внутрь, if __name__ == '__main__': у меня работает, но я не знаю, хорошее ли это решение.
  • 0
    @Neutralizer Не уверен, как вы это делаете, но это не должно работать, так как django импортирует этот модуль. Возможно, вы избегаете циклического удаления, вообще не импортируя модель User.
Показать ещё 1 комментарий
19

Просто столкнулся с той же проблемой. Проблема заключается в том, что django-registration несовместим с пользовательской моделью django 1.7.

Простое исправление - это изменить эти строки кода на установленном модуле django-registration::

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 

Мина находится в .venv/local/lib/python2.7/site-packages/registration/models.py (virtualenv)

  • 7
    Вместо этого вы можете использовать django-registration-redux. Это обновленный и поддерживаемый форк: github.com/macropin/django-registration
  • 1
    django-registration-redux исправил проблему для меня (у меня был точно такой же стек, как и у OP)
Показать ещё 1 комментарий
10

Это работает для меня для Django 1.9. Выполненный Python script был в корне проекта Django.

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

Установите PROJECT_NAME и APP_NAME на ваш

  • 1
    Спасибо, запуск django.setup() исправил проблему для меня.
  • 0
    Меня устраивает. но я не знаю, почему мы должны запускать этот код, как мы уже упоминали в нашем файле wsgi.
Показать ещё 1 комментарий
5

Другим вариантом является то, что у вас есть двойная запись в INSTALLED_APPS. Это бросило эту ошибку для двух разных приложений, которые я тестировал. По-видимому, это не что-то, что проверяет Django, но затем, кто глупый, чтобы дважды добавить одно и то же приложение в список. Я, тот кто.

2

установить django-registration-redux == 1.1 вместо django-registration, если вы используете django 1.7

2

Я столкнулся с этой проблемой, когда использовал djangocms и добавил плагин (в моем случае: djangocms-cascade). Конечно, мне пришлось добавить плагин к INSTALLED_APPS. Но порядок здесь важен.

Поместить 'cmsplugin_cascade' до 'cms' решил проблему.

  • 0
    порядок cms, mptt, menus, sekizai, filer, easy_thumbnails значение: cms, mptt, menus, sekizai, filer, easy_thumbnails
2

У вас есть виртуальная среда Python, которую нужно ввести, прежде чем запускать manage.py?

Я сам столкнулся с этой ошибкой, и в этом была проблема.

-2

Ваш manage.py является "неправильным"; Я не знаю, откуда вы его взяли, но это не 1,7 manage.py - вы использовали какую-то фанк-сборку перед выпуском или что-то еще?

Reset ваш manage.py к обычному, как показано ниже, и вещи должны просто работать:

#!/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)
  • 12
    Мой manage.py правильный, и я также получаю проблему.
  • 0
    У меня есть manage.py как этот, и у меня все еще есть эта проблема

Ещё вопросы

Сообщество Overcoder
Наверх
Меню