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-registrationdjango-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.core.exceptions.ImproperlyConfigured
django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置