【问题标题】:Django 1.7 upgrade error: AppRegistryNotReady: Models aren't loaded yetDjango 1.7 升级错误:AppRegistryNotReady:模型尚未加载
【发布时间】:2014-10-30 02:35:03
【问题描述】:

我正在尝试将项目从 Django 1.6 升级到 1.7。到目前为止,我已经创建了一个具有所有相同安装的新 virtualenv,并将 Django 版本升级到新版本。我需要从 South 升级,但这样做时出错,所以我想我最初只是尝试 runserver,但我收到以下错误:

Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
        utility.execute()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
        django.setup()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
        apps.populate(settings.INSTALLED_APPS)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
        app_config.import_models(all_models)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/apps/config.py", line 197, in import_models
        self.models_module = import_module(models_module_name)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
        __import__(name)
      File "/Users/Name/Dev/tps/products/models.py", line 127, in <module>
        watson.register(Product.objects.exclude(productimage=None))
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/query.py", line 698, in exclude
        return self._filter_or_exclude(True, *args, **kwargs)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/query.py", line 707, in _filter_or_exclude
        clone.query.add_q(~Q(*args, **kwargs))
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1287, in add_q
        clause, require_inner = self._add_q(where_part, self.used_aliases)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1314, in _add_q
        current_negated=current_negated, connector=connector)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1138, in build_filter
        lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1076, in solve_lookup_type
        _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1339, in names_to_path
        field, model, direct, m2m = opts.get_field_by_name(name)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/options.py", line 416, in get_field_by_name
        cache = self.init_name_map()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/options.py", line 445, in init_name_map
        for f, model in self.get_all_related_m2m_objects_with_model():
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/options.py", line 563, in get_all_related_m2m_objects_with_model
        cache = self._fill_related_many_to_many_cache()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/db/models/options.py", line 577, in _fill_related_many_to_many_cache
        for klass in self.apps.get_models():
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
        result = user_function(*args, **kwds)
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/django/apps/registry.py", line 168, in get_models
        self.check_models_ready()
      File "/Users/Name/.virtualenvs/test17/lib/python2.7/site-packages/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.

任何想法可能导致错误以及如何修复它?

【问题讨论】:

  • 您是否从已安装的应用程序中删除了南?
  • 是的,我按照这里的步骤操作:link,但我仍然收到错误
  • 注意:我正在使用 django-allauth,并且对该应用程序中的迁移执行相同的操作,不确定这是否会导致问题。
  • 在执行 runserver 或使用 manage.py 进行任何操作时,我反复收到此错误。这是在成功升级到 1.7 之后很久。原来与此无关,而是我复制了一堆代码以供参考,并留在了 models.py 文件的底部

标签: django django-1.7


【解决方案1】:

问题出在这一行(“/Users/Name/Dev/tps/products/models.py”,第 127 行):

watson.register(Product.objects.exclude(productimage=None))

您尝试在导入时引用模型。在 Django 1.7 中不再可能。 Django 1.7 允许您仅在加载所有应用程序后使用您的模型。您应该将此调用移至AppConfig 的ready 回调,如下所示:

from django.apps import AppConfig


class ProductsConfig(AppConfig):
    name = 'products'

    def ready(self):
        Product = self.get_model('Product')
        watson.register(Product.objects.exclude(productimage=None))

那么您应该在您的products 应用程序的__init__.py 中引用此AppConfig:

default_app_config = 'products.apps.ProductsConfig'

其中apps 是您放置配置的模块的名称。

相关 Django 文档:https://docs.djangoproject.com/en/dev/ref/applications/

总体而言,由于这一变化,迁移到 Django 1.7 并不像人们想象的那么容易。以下是一些故障排除提示:https://docs.djangoproject.com/en/1.7/ref/applications/#troubleshooting

【讨论】:

  • 谢谢 Vasily,我将尝试进行这些更改,并让您知道它们是如何进行的。这是第三方搜索应用 Watson,所以我猜他们需要在 1.7 版本中对其应用进行这些更改
  • 太棒了,做到了!我在 Watson 注册了多个搜索,我把它们都放在那里。我只需要将“import Watson”添加到 apps.py
  • 我收到此错误是因为我的 wsgi.py 文件已过期,django 1.7 对此有一种新格式,在使用 gunicorn 19.1.0 修复此问题后一切正常(19.1.1 已损坏)。 runserver 一切都很好,所以我只在产品部署中遇到了这个问题。
  • 在执行 runserver 或使用 manage.py 进行任何操作时,我反复收到此错误。这是在成功升级到 1.7 之后很久。结果证明与此无关,而是我复制了一堆代码以供参考,并留在了 models.py 文件的底部。在 django 1.7 中,如果出现此错误,则错误可能在 models.py 某处
【解决方案2】:

当我将我的 django 项目模板更新到 1.7 时,我遇到了这个错误。改变的一件事是 wsgi.py 文件,因此需要一些更新。这是我的回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py", line 93, in handle
    self.handle_request(listener, req, client, addr)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/sync.py", line 134, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/core/handlers/wsgi.py", line 168, in __call__
    self.load_middleware()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/core/handlers/base.py", line 46, in load_middleware
    mw_instance = mw_class()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/middleware/locale.py", line 23, in __init__
    for url_pattern in get_resolver(None).url_patterns:
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/core/urlresolvers.py", line 372, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/core/urlresolvers.py", line 366, in urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/kpmteam/staging/site/kpm/urls.py", line 7, in <module>
    admin.autodiscover()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/contrib/admin/__init__.py", line 23, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/utils/module_loading.py", line 67, in autodiscover_modules
    for app_config in apps.get_app_configs():
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/apps/registry.py", line 137, in get_app_configs
    self.check_apps_ready()
  File "/home/kpmteam/staging/deploys/20141029-115625/site/lib/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
AppRegistryNotReady: Apps aren't loaded yet.

这就是 wsgi.py 文件的样子:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

现在(运行 Django 1.7 和 gunicorn 19.1.0):

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

更改最后两行修复了它。请注意,您的 DJANGO_SETTINGS_MODULE 可能不同,通常是“project_name.settings”

【讨论】:

    【解决方案3】:

    我迟到了,但如果你使用 django-registration,你将不得不切换到 django-regitration-redux。

    https://pypi.python.org/pypi/django-registration-redux/

    看到这个答案:Django-registration compatibility issue with django 1.7

    【讨论】:

      【解决方案4】:

      我找到了解决方案:

      import django
      

      django.setup()

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 1970-01-01
        • 2016-03-10
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-21
        相关资源
        最近更新 更多