运行时错误:应用程序注册表尚未准备好

问题描述 投票:0回答:4

我正在尝试创建一个脚本,用测试用户填充数据库。我是 Django 和 Python 的新手。我不断得到:

Runtime error: App registry isn't ready yet. 

这是输出和错误:

starting population script
Traceback (most recent call last):
File "populate.py", line 32, in <module>
populate()
File "populate.py", line 22, in populate
i.save()
File "c:\Python27\lib\site-packages\django-1.7a2-py2.7.egg\django\db\models\base.py",    line 603, in save
force_update=force_update, update_fields=update_fields)
...
...
...    
File "c:\Python27\lib\site-packages\django-1.7a2-py2.7.egg\django\apps\registry.py", line   156, in get_models
self.check_ready()
File "c:\Python27\lib\site-packages\django-1.7a2-py2.7.egg\django\apps\registry.py",   line 119, in check_ready
raise RuntimeError("App registry isn't ready yet.")
RuntimeError: App registry isn't ready yet.

这是代码:

import os
import datetime

def populate():
    freer = User.objects.create_user( 'joyyie', '[email protected]', 'e')
    cat = User.objects.create_user( 'steve', '[email protected]', 'e')
    dog = User.objects.create_user( 'aasd', '[email protected]', 'ad')
    cow = User.objects.create_user( 'sadsfa', '[email protected]', 't' )
    pig = User.objects.create_user( 'regibald', '[email protected]', '0')
    donkey = User.objects.create_user( 'turnip', '[email protected]', 'pop')
    human = User.objects.create_user( 'tutu', '[email protected]', 'pa')
    a = [freer,cat,dog,cow,pig,donkey,human]

    for i in a:
        i.first_name= 'jackee'
        i.is_superuser=True
        i.is_staff=False
        i.date_joined=datetime.datetime.today()
        i.last_login=datetime.datetime.today()

        i.save()


if __name__=='__main__':
    print "starting population script"
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'infosmos.settings')
    from django.conf import settings
    from django.db import models
    from django.contrib.auth.models import User
    populate()

有没有办法通过使用

signal
或其他东西来强制用户配置文件创建等待注册表应用程序?

python django runtime-error django-1.7
4个回答
21
投票

[django 1.7] 您想要运行的独立脚本,导入 django 和如下设置

import os

import django

[...]


if __name__ == '__main__':  
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

    django.setup()

5
投票

根据 Django 1.7 发行说明的“启动顺序”子句,这是已知且预期的行为:

另一个常见的罪魁祸首是 django.contrib.auth.get_user_model()。使用 AUTH_USER_MODEL 设置在导入时引用用户模型。

这样就可以了

供参考: https://docs.djangoproject.com/en/dev/releases/1.7/#app-loading-changes


2
投票

我发现,如果我使用

manage.py
命令通过
execfile()
shell 运行 populate,那么它会正常运行。在开始修改数据库或运行外部代码之前,需要设置所有内容。感谢 lanzz 的提示。


0
投票

如果所有其他解决方案都不适合您(就像我一样),并且您确定在导入时没有访问数据库,那么问题很可能与某些不兼容或缺失的依赖项以及“AppRegistryNotReady”异常只是一个后备。 对我来说,我一一跟踪异常的回溯,直到我终于知道真正的问题是什么! 你可能需要去

.../django/core/management/__init__.py
,在类
execute
中搜索方法
ManagementUtility
,你会发现以下代码:

try:
    settings.INSTALLED_APPS
except ImproperlyConfigured as exc:
    self.settings_exception = exc
except ImportError as exc:
    self.settings_exception = exc

if settings.configured:
    ....
else:
    django.setup() # Doesn't get called :)

诀窍是删除异常处理(

settings.INSTALLED_APPS
)。从 try 中复制代码并将其放在
try
单词上方,运行
python manage.py check
,应该显示真正的异常,而不是“AppRegistryNotReady”模糊消息。现在您可以解决real问题!

© www.soinside.com 2019 - 2024. All rights reserved.