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


166

Это обратная связь в моей системе 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)

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


1
У вас есть каталог с именем django-django-4c85a0d; 4c85a0dоказывается (нестабильным) хешем коммитов Django. Я не верю, что вы на самом деле используете Django 1.7 (см. Мой ответ)
Kristian Glass

Вы когда-нибудь решали свою проблему?
Ник Спейсек

Это также может быть связано с venv. Воссоздание каталога venv исправило это для меня. `` `mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r needs.txt` ``
Thomas - BeeDesk

1
Я также сталкиваюсь с некоторой ошибкой, подобной этой, когда я добавляю LOGGING в settings.py на моем Mac, это потому, что я создаю файл журнала в /var/log/xx/debug.log и не имею разрешения, поэтому я использую sudo для Runserver, и все в порядке. Может помочь некоторым геям
gkiwi

Я видел эту ошибку при запуске docker-compose exec .... Проблема заключалась в том, что я не передавал необходимые переменные окружения в команду docker-compose exec .
Мэтью Хегарти

Ответы:


59

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

Наш проект начался с 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файл никогда не имеет import sysв нем. Не в 1.4, не в 1.5 и не в 1.7. Если он у вас был, он был добавлен кем-то вручную - он не добавлен стартовым проектом django-admin.
Вим

Полезно знать, моя ошибка (и плохая память). Прошло много времени с тех пор, как я сделал это, но я был почти уверен, что в то время я пытался задокументировать встроенное поведение.
Ник Спейсек

236

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

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 кажется часом реальной работы.
JL Peyret

12
Где я могу запустить вышеуказанную команду? Я добавляю его в файл .py или как?
Хофи

1
Вы должны запустить это в том же контексте, в котором возникает ошибка
Nimo

3
у этого достаточно голосов, чтобы заслужить правильный ответ
acid_crucifix

Это также решило проблему, с которой я столкнулся в сценарии обновления командной строки, который сломался при переходе на 1.7.
Джейсон Чемпион

58

Проблема в вашем регистрационном приложении. Кажется , Джанго-регистрация звонков 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()внутренние методы (а не на уровне модулей), а в FKs использовал что-то вроде:

user = ForeignKey(settings.AUTH_USER_MODEL)

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


положить его внутрь if __name__ == '__main__':работает для меня, но я не знаю, хорошее ли это решение.
Umair A.

@Neutralizer Не уверен, как вы это делаете, но это не должно работать, поскольку django импортирует этот модуль. Возможно, вы избегаете циклического удаления, вообще не импортируя модель User.
Гонз

1
Я имею в виду поставить эти строки внутри проверки имени. Это может быть пропустить выполнение. Я не сделал достаточно тестов.
Умайр А.

18

Просто столкнулся с той же проблемой. Проблема из-за 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. Это обновленный и поддерживаемый
ветвь

1
django-registration-reduxисправил проблему для меня (у меня был точно такой же стек, как у OP)
Пьер де Леспин

1
В случае, если кто-то боролся с этим на Django 1.8, он также применяется там.
Эндрю Шустер

14

Это работает для меня для Django 1.9. Сценарий Python для выполнения находился в корне проекта Django.

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

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


1
Меня устраивает. но я не знаю, почему мы должны запускать этот код, как мы уже упоминали в нашем файле wsgi.
Мистер Код

5

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


2

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

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


2

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

Чтобы разместить cmsplugin_cascade до того, как cms решит проблему.


1
порядок имел значение: cms, mptt, menus, sekizai, filer, easy_thumbnails
имел

2

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


0

./manage.py migrate

Это решило мою проблему


Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом. - Из обзора
Джордж З.

@GeorgeZ. Это похоже на попытку ответить на вопрос и, по-видимому, решило проблему, когда этот постер натолкнулся на него - даже если вы считаете, что это неправильно или стоит более детально проработать, искренняя попытка ответить на вопрос не должна быть удалена из обзора
CertainPerformance

-1

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

Сбросьте 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)

У меня есть manage.py как этот, и у меня все еще есть эта проблема
rmosolgo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.