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

171 投票
14 回答
148752 浏览
提问于 2025-04-18 18:47

这是我在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中使用registration这个应用时,我遇到了这个错误。

14 个回答

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改成你自己的名字。

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 (虚拟环境)

58

问题出在你的注册应用上。看起来django-registration在models.py文件中调用了get_user_model(),而这个调用是在模块级别进行的(也就是在应用注册过程中,模型还在加载的时候)。这样做是行不通的:

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)

顺便说一下,在你的manage.py文件中不需要调用django.setup(),这个调用已经在execute_from_command_line中为你处理了。(来源)

239

运行这些命令解决了我的问题(感谢这个回答):

import django
django.setup()

不过我不太明白为什么我需要这样做。如果有人能解释一下,我会很感激。

61

这是我们解决问题的方法,还有这些朋友们的帮助:

我们的项目最开始是用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()

当我更新到1.7版本的WSGI处理器时:

import os

from django.core.wsgi import get_wsgi_application

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

现在一切都正常了。

撰写回答