Django 1.7 抛出 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
Django 1.7 抛出 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
这是我在Windows系统上的跟踪回溯。
我的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中使用注册应用程序时,我遇到了这个错误。
在更新Django版本时,出现了"Django 1.7 throws django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet"的错误。解决方法如下:
在Django 1.4版本中,wsgi.py文件的代码如下:
import os from django.core.handlers.wsgi import WSGIHandler os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' application = WSGIHandler()
在更新到Django 1.7版本时,需要修改wsgi.py文件的代码如下:
import os from django.core.wsgi import get_wsgi_application os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' application = get_wsgi_application()
这样修改后,问题得到解决。需要注意的是,自动生成的wsgi.py文件中从未包含import sys
的语句。无论是在1.4版本、1.5版本还是1.7版本中,都没有这个语句。如果wsgi.py文件中包含了import sys
语句,那么是由某人手动添加的,而不是由django-admin startproject自动生成的。
这个错误的解决方法得到了Stack Overflow上的一些用户的验证和采纳。
问题的出现原因是在注册应用程序中。django-registration在models.py中的模块级别调用了get_user_module(),而在该过程中模型仍在被应用程序注册过程中加载,这将不再起作用。
解决方法是将models文件更改为仅在方法中调用get_user_model()(而不是在模块级别),并在FKs中使用类似以下的内容:
user = ForeignKey(settings.AUTH_USER_MODEL)
另外,你的manage.py文件中不需要调用django.setup(),因为它已经在execute_from_command_line中为你调用了。将其放在if __name__ == '__main__':中对我来说是有效的,但我不知道这是否是一个好的解决方案。
不确定你是如何做的,但那不应该起作用,因为django正在导入该模块。可能你通过根本不导入User模型来避免循环依赖。
我的意思是将这些行放在名称检查中。这可能会跳过执行。我还没有进行足够的测试。
在Django 1.7中,出现了一个错误:django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet。下面的内容解释了这个问题出现的原因以及解决方法。
根据stackoverflow上的一个答案,运行以下命令可以解决这个问题:
import django django.setup()
然而,我不确定为什么需要这样做。希望有人能提供解释。
根据django 1.7发布说明中的信息,Django有了一种新的加载已安装应用程序的方式。如果你在Python脚本中加载Django(比如我在自定义单元测试中),在继续之前需要进行一些初始化工作,而调用setup()就是这样做的方法。除此之外,对Django团队表示赞赏,升级从1.6.2到1.7.1似乎只需要一个小时的实际工作。
那么在哪里运行上述命令?你应该在出现错误的上下文中运行它。
这个答案有足够的赞同票来被标记为正确答案。
这也解决了我在迁移到1.7版本时遇到的问题,问题发生在一个命令行更新脚本中。
如果你正在构建一个独立的应用程序,你需要调用django.setup(),参考文档:docs.djangoproject.com/en/1.8/topics/settings/… 其他的解决方法(如get_wsgi_application())在后台调用了django.setup()或类似的方法。
我正在从1.4版本升级,这个解决方法不起作用,而接受的答案起作用。提供给其他人参考。