Django 1.7抛出django.core.exceptions.AppRegistryNotReady:模型尚未加载

dou*_*leo 163 python django

这是我的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.
Run Code Online (Sandbox Code Playgroud)

而我的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)
Run Code Online (Sandbox Code Playgroud)

当我尝试在Django 1.7中使用注册应用程序时,我收到此错误

Nim*_*imo 233

运行这些命令解决了我的问题(归功于这个答案):

import django
django.setup()
Run Code Online (Sandbox Code Playgroud)

但是我不确定为什么我需要这个.评论将不胜感激.

  • 对不起,只是唠叨我在django 1.7发布的关于破坏变化的说明中所读到的内容.https://docs.djangoproject.com/en/dev/releases/1.7/#backwards-incompatible-changes-in-1-7.基本上,Django有一种新的方式来加载已安装的应用程序.如果从Python脚本加载Django(就像我在自定义单元测试中那样),在继续之前需要进行一些初始化,并且调用setup()是如何做的.除此之外,对团队的称赞,我的1.6.2到1.7.1升级似乎需要一个小时的实际工作. (12认同)
  • 我在哪里运行上面的命令?我把它添加到.py文件或什么? (9认同)
  • 这有足够的支持值得标记正确的答案 (3认同)

gon*_*onz 56

问题出在您的注册应用中.似乎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    
Run Code Online (Sandbox Code Playgroud)

我将此模型文件更改为仅调用get_user_model()内部方法(而不是在模块级别),并且在FK中使用类似于:

user = ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

顺便说一下django.setup(),你的manage.py文件中不应该要求调用它,它会在你身边调用execute_from_command_line.(来源)


Nic*_*cek 56

这就是为我们和这些人解决的问题:

我们的项目从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()
Run Code Online (Sandbox Code Playgroud)

当我更新到1.7样式的WSGI处理程序时:

import os

from django.core.wsgi import get_wsgi_application

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

现在一切都有效.


小智 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  
Run Code Online (Sandbox Code Playgroud)

至::

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 
Run Code Online (Sandbox Code Playgroud)

我在.venv/local/lib/python2.7/site-packages/registration/models.py(virtualenv)

  • 您可以使用django-registration-redux代替.它更新并维护了fork:https://github.com/macropin/django-registration (7认同)

Lor*_*ate 14

这适用于Django 1.9.要执行的Python脚本位于Django项目的根目录中.

    import django 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings")
    django.setup()
    from APP_NAME.models import *
Run Code Online (Sandbox Code Playgroud)

将PROJECT_NAME和APP_NAME设置为您的


Mar*_*ark 5

另一个选择是您在INSTALLED_APPS中有重复的条目.这为我测试过的两个不同的应用程序引发了这个错误.显然这不是Django检查的东西,但是那些傻到将两个相同的应用程序放在列表中的人.我,那是谁.