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

171

这是在我的Windows系统上的回溯(traceback)。

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应用程序时,出现了以下错误:


1
你有一个名为django-django-4c85a0d的目录;4c85a0d恰好是一个(不稳定的)Django提交哈希值。我不认为你实际上正在使用Django 1.7(参见我的回答)。 - Kristian Glass
你最终解决了你的问题吗? - Nick Spacek
1
这也可能与 venv 相关。重新创建 venv 目录对我有用。mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r requirements.txt - Thomas - BeeDesk
1
当我在我的Mac的settings.py中添加LOGGING时,我也遇到了类似的错误,这是因为我在/var/log/xx/debug.log上创建了一个日志文件,但没有权限,所以我使用sudo运行服务器,一切都很好。可能会帮助一些人。 - gkiwi
当我运行 docker-compose exec ... 时,我看到了这个错误。问题在于我没有将必需的环境变量传递给命令 docker-compose exec - Matthew Hegarty
14个回答

239

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

import django
django.setup()

但是我不确定为什么需要这个。欢迎留言。


13
抱歉,我只是在模仿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似乎只需要花费一个小时的真正工作时间。 - JL Peyret
13
以上命令应该在哪里运行?我需要将其添加到.py文件中还是其他地方? - KhoPhi
1
你应该在发生错误的相同上下文中运行此代码。 - Nimo
3
这个回答已经获得足够的点赞数,值得被标记为正确答案。 - acid_crucifix
这也解决了我在命令行更新脚本中遇到的一个问题,该问题在升级到1.7版本时出现了故障。 - Jason Champion
显示剩余2条评论

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()

现在一切都正常了。


1
我不同意@wim的编辑,不是因为我认为我们应该保留不必要的导入,而是因为我举了一个例子,展示了自动生成的wsgi.py在我从1.7版本的wsgi.py中复制差异之前和之后的样子。 - Nick Spacek
1
自动生成的 wsgi.py 文件从未包含 import sys。不论是在 1.4、1.5 还是 1.7 版本中都没有。如果你的文件里有这个语句,那么它是被手动添加进去的,而不是由 django-admin startproject 自动生成的。 - wim
好知道,我的错误(和糟糕的记忆)。我已经有一段时间没有做这个了,但我很确定当时我是在尝试记录内置行为。 - Nick Spacek

58

问题出在你的注册应用程序中。看起来django-registration在models.py中以模块级别调用get_user_module()(当模型仍由应用程序注册过程加载时)。这将不再起作用:

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()(而不是在模块级别调用),并在外键中使用类似以下的内容:

我会将此模型文件更改为只在方法内部调用get_user_model()(而不是在模块级别),并在外键中使用类似以下的内容:
user = ForeignKey(settings.AUTH_USER_MODEL)

顺便提一下,在你的manage.py文件中不需要调用django.setup(),因为它已经在execute_from_command_line中为你调用了。(来源


把代码放在 if __name__ == '__main__': 里面对我来说是有效的,但我不确定这是否是一个好的解决方案。 - Umair A.
@Neutralizer 不确定你是如何做到的,但这不应该起作用,因为Django正在导入此模块。可能你通过根本不导入用户模型来避免循环依赖关系。 - gonz
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Umair A.

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


7
你可以使用django-registration-redux代替。它是已更新并维护的分支:https://github.com/macropin/django-registration - TJL
1
django-registration-redux 对我解决了这个问题(我和原帖作者遇到的情况完全一样)。 - Pierre de LESPINAY
1
如果有人在Django 1.8上遇到了这个问题,它同样适用于那里。 - Andrew Schuster

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文件中提到了这些。 - Mr Code

5

另一种可能是您在INSTALLED_APPS中有重复条目。这导致我测试的两个不同应用程序出现了此错误。显然,这不是Django检查的内容,但是谁会傻到将相同的应用程序两次放入列表中呢?是我,就是我。


3
我非常确定现在还不晚。如果您正在使用Django 4和.env文件进行设置,那么如果您在settings.py中定义了一个值,而该值在.env文件中不存在,您将遇到此错误:
请看以下场景:
我在我的settings.py中有一个PLAID_KEY,如下所示:
PLAID_KEY=env('PLAID_KEY')

然而,在我的.env文件中不存在PLAID_KEY,添加它后问题得以解决。

我也遇到了这个问题。Djoser的SIGNING_KEY不可用。 - Ajani Timothy

2

您是否拥有需要在执行manage.py之前进入的Python虚拟环境?

我自己也遇到了这个错误,而且那就是问题所在。


2

如果您使用的是Django 1.7,请安装django-registration-redux==1.1而不是django-registration。


2

我在使用djangocms并添加插件(在我的情况下是:djangocms-cascade)时遇到了这个问题。当然,我必须将插件添加到INSTALLED_APPS中。但是顺序很重要。

将“cmsplugin_cascade”放在“cms”之前解决了这个问题。


1
顺序很重要:cms,mptt,menus,sekizai,filer,easy_thumbnails - blakev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接