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

Posted

技术标签:

【中文标题】Django 1.7 抛出 django.core.exceptions.AppRegistryNotReady:模型尚未加载【英文标题】:Django 1.7 throws django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet 【发布时间】:2014-10-21 16:08:43 【问题描述】:

这是我的 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 应用程序时出现此错误

【问题讨论】:

你有一个名为django-django-4c85a0d的目录; 4c85a0d 恰好是一个(不稳定的)Django 提交哈希。我不相信您实际上在使用 Django 1.7(参见我的回答) 您的问题解决了吗? 这也可能与venv 有关。重新创建 venv 目录为我修复了它。 ``` mv venv venv_old virtualenv venv source ./venv/bin/activate pip install -r requirements.txt `` 当我在我的 mac 上的 settings.py 中添加 LOGGING 时,我也遇到了这样的错误,这是因为我在 /var/log/xx/debug.log 上创建了一个日志文件并且没有许可,所以我使用 sudo 来运行服务器,一切都很好。可以帮助一些同性恋者 我在运行docker-compose exec ... 时看到了这个错误。问题是我没有将所需的环境变量传递给命令docker-compose exec。 【参考方案1】:

运行这些命令解决了我的问题(感谢this answer):

import django
django.setup()

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

【讨论】:

抱歉,只是模仿我在 django 1.7 发行说明中读到的有关重大更改的内容。 docs.djangoproject.com/en/dev/releases/1.7/…。基本上,Django 有一种新的方式来加载已安装的应用程序。如果您从 Python 脚本加载 Django(就像我在自定义单元测试中一样),则需要在继续之前完成一些初始化,然后调用 setup() 是如何做到的。除此之外,感谢团队,我从 1.6.2 升级到 1.7.1 似乎需要一个小时的实际工作。 我在哪里运行上面的命令?我将它添加到 .py 文件中还是什么? 您应该在发生错误的相同上下文中运行它 这有足够的赞成票被标记为正确答案 这也解决了我在命令行更新脚本中遇到的问题,该脚本在迁移到 1.7 时中断。【参考方案2】:

这就是为我们和these folks解决的问题:

我们的项目从 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()

现在一切正常。

【讨论】:

我不同意@wim 的编辑,不是因为我认为我们应该保留不必要的导入,而是因为我给出了一个自动生成的 wsgi.py 之前的示例,并且在我复制了与 1.7 自动生成的 wsgi.py 的差异之后的样子。 自动生成的wsgi.py 文件中永远不会有import sys。不在 1.4 中,不在 1.5 中,在 1.7 中也没有。如果你有它,它是由某人手动添加的 - 它不是由 django-admin startproject 添加的。 很高兴知道,我的错误(和记忆力差)。我做这个已经有一段时间了,但我很确定当时我正在尝试记录内置行为。【参考方案3】:

问题出在您的注册应用程序中。 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(),并且在 FK 中使用类似:

user = ForeignKey(settings.AUTH_USER_MODEL)

顺便说一句,您的manage.py 文件中不应该需要调用django.setup(),而是在execute_from_command_line 中为您调用。 (source)

【讨论】:

将其放入 if __name__ == '__main__': 对我有用,但我不知道这是否是一个好的解决方案。 @Neutralizer 不知道你是怎么做的,但是这不应该工作,因为 django 正在导入这个模块。可能您根本不导入 User 模型,从而避免了循环 dep。 我的意思是把这些行放在名称检查中。它可能会跳过执行。我没有做足够的测试。【参考方案4】:

刚刚遇到同样的问题。问题是因为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)

【讨论】:

你可以使用 django-registration-redux 代替。已更新和维护 fork:github.com/macropin/django-registration django-registration-redux 为我解决了这个问题(我的堆栈与 OP 完全相同) 如果有人在 Django 1.8 上遇到这个问题,它也适用于此。【参考方案5】:

这适用于 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 设置为您的

【讨论】:

它对我有用。但我不知道为什么我们应该运行这段代码,因为我们已经在 wsgi 文件中提到了这些。【参考方案6】:

另一种选择是在 INSTALLED_APPS 中有重复的条目。这对我测试的两个不同的应用程序抛出了这个错误。显然这不是 Django 检查的东西,但是谁又傻到将同一个应用程序两次放在列表中。我,就是那个人。

【讨论】:

【参考方案7】:

在运行 manage.py 之前是否有需要输入的 Python 虚拟环境?

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

【讨论】:

【参考方案8】:

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

将 'cmsplugin_cascade' 之前 'cms' 解决了问题。

【讨论】:

订单很重要:cms, mptt, menus, sekizai, filer, easy_thumbnails【参考方案9】:

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

【讨论】:

【参考方案10】:

./manage.py migrate

这解决了我的问题

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review @GeorgeZ。它看起来像是试图回答这个问题,并且当这张海报遇到它时显然解决了这个问题 - 即使你认为它是错误的或者应该更详细地阐述,也不应该从评论中删除真正尝试回答这个问题的尝试跨度> 【参考方案11】:

如果您在创建模型之间的 ForeignKey 关系的上下文中遇到此错误。下面的示例引发AppRegistryNotReady: Models aren't loaded yet 错误。

from my_app.models import Workspace

workspace = models.ForeignKey(Workspace)

那么请尝试将模型引用为字符串。

from my_app.models import Workspace

# One of these two lines might fix the problem.
workspace = models.ForeignKey('Workspace')
workspace = models.ForeignKey('my_app.Workspace')

【讨论】:

【参考方案12】:

您的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,但我仍然有这个问题【参考方案13】:

我的问题来自 init.py 。我做了一个应用程序并想这样做:

from MY_APP import myfunc

而不是:

from MY_APP.views import myfunc

当我回滚对这些部分的更改时。一切正常。

【讨论】:

以上是关于Django 1.7 抛出 django.core.exceptions.AppRegistryNotReady:模型尚未加载的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.7 中解决“django.core.exceptions.ImproperlyConfigured:应用程序标签不是唯一的,重复:foo”?

无法将 Django 从 1.7 迁移到 1.8

[django]l利用xlrd实现xls文件导入数据

django.core.exceptions.ImproperlyConfigured

mysql导入excel十多万行

django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置