Django 1.8 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
在进行 Django 日常开发时,经常会建立一个独立的 PY 文件用来测试写好的方法.
# mysite/main.py
# -*- coding:utf-8 -*-
from deploy.getInfo import *
from getRunTime import *
def main():
# 获取域
print getDomain()
# 获取域名对应规则
print getDomainRewrite("1")
if __name__ == ‘__main__‘:
main()
启动 Django 时报错
Traceback (most recent call last):
File "E:\MyEclipse_work\ops\deploy\main.py", line 35, in <module>
main()
File "E:\MyEclipse_work\ops\deploy\main.py", line 12, in main
print getDomain()
File "E:\MyEclipse_work\ops\deploy\deploy\getInfo.py", line 10, in getDomain
return json.dumps(list(deploy.objects.filter().values("domain_id__domain_name","domain_id")))
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\query.py", line 640, in values
return self._clone(klass=ValuesQuerySet, setup=True, _fields=fields)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\query.py", line 992, in _clone
c._setup_query()
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\query.py", line 1169, in _setup_query
self.query.add_fields(self.field_names, True)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\sql\query.py", line 1660, in add_fields
name.split(LOOKUP_SEP), opts, alias, allow_many=allow_m2m)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\sql\query.py", line 1443, in setup_joins
names, opts, allow_many, fail_on_missing=True)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\sql\query.py", line 1347, in names_to_path
field, model, _, _ = opts.get_field_by_name(name)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\options.py", line 406, in get_field_by_name
cache = self.init_name_map()
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\options.py", line 435, in init_name_map
for f, model in self.get_all_related_m2m_objects_with_model():
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\options.py", line 520, in get_all_related_m2m_objects_with_model
cache = self._fill_related_many_to_many_cache()
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\db\models\options.py", line 534, in _fill_related_many_to_many_cache
for klass in self.apps.get_models():
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\utils\lru_cache.py", line 101, in wrapper
result = user_function(*args, **kwds)
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\apps\registry.py", line 168, in get_models
self.check_models_ready()
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\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.
最后的报错为: django.core.exceptions.AppRegistryNotReady: Models aren‘t loaded yet.
报错信息来自于 registry.py 的断言.
File "C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\apps\registry.py", line 131, in check_models_ready
raise AppRegistryNotReady("Models aren‘t loaded yet.")
因此查看 C:\Python27\lib\site-packages\django-1.8-py2.7.egg\django\apps\registry.py 文件中查看 raise AppRegistryNotReady
def check_models_ready(self):
"""
Raises an exception if all models haven‘t been imported yet.
"""
if not self.models_ready:
raise AppRegistryNotReady("Models aren‘t loaded yet.")
通过注释可以看出引起异常的原因是因为 models 没有被 import
于是在程序开头 import 处加入了
from deploy.models import *
再次运行报错依旧.
在官网文档中搜索 AppRegistryNotReady 异常时发现关于 Standalone scripts 的描述.

简单来讲,Django 测试依赖于 DJANGO_SETTINGS_MODULE 环境变量. 如果我们想要使用单独的 PY 脚本来测试 Django,那么应该在我们的程序开始初始化 Django 环境.否则就会报出 AppRegistryNotReady 异常.
# 初始化命令 import django django.setup()
增加之后运行正常.
随即查看了 django.setup() 源码.
from django.utils.version import get_version
VERSION = (1, 8, 0, ‘alpha‘, 0)
__version__ = get_version(VERSION)
def setup():
"""
Configure the settings (this happens as a side effect of accessing the
first setting), configure logging and populate the app registry.
"""
from django.apps import apps
from django.conf import settings
from django.utils.log import configure_logging
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
apps.populate(settings.INSTALLED_APPS)
关于 django.setup() 方法的官方描述

参考文档
■ https://docs.djangoproject.com/en/1.8/releases/1.7/#app-loading-changes
■ https://docs.djangoproject.com/en/1.8/ref/applications/#django.setup
文章来自:http://www.cnblogs.com/mydevops/p/4333263.html