Обновление Django с 1.8 до 1.9 ломается при импорте модели в init

Я столкнулся с той же проблемой, что @JohnnyQ прокомментировал здесь.
Мой__init__.py относится к множественному импорту, который, в свою очередь, относится к моделям, а они необходимы.

Код отлично работает с django 1.8.x, но ломается, когда Django обновляется до 1.9.x.

Я предполагаю, что это проблема с последовательностью загрузки классов. Что изменилось в версии 1.9 относительно импорта моделей в приложениях, вызывающих исключение AppRegistryNotReady?

Отслеживание здесь:

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_bundle/pydev_monkey.py", line 729, in __call__
    ret = self.original_func(*self.args, **self.kwargs)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 113, in inner_run
    autoreload.raise_last_exception()
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
  File "/usr/local/Cellar/python@2/2.7.17/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/__init__.py", line 1, in <module>
    from mycompany.core import care_team
  File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/care_team.py", line 8, in <module>
    from mycompany.core import models as core_models
  File "/Users/vinod/mycompany/SourceCodes/mycompany_server/mycompany/core/models.py", line 16, in <module>
    from django.contrib.auth.models import User
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 52, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/db/models/base.py", line 105, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 237, in get_containing_app_config
    self.check_apps_ready()
  File "/Users/vinod/virtualenvs/py2/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

1 ответ

Решение

В Django 1.9 появился реестр приложений, который инициализируется за 3 шага, как указано в документации.

  • Во-первых, он импортирует все элементы в INSTALLED_APPS. На этом этапе код не должен импортировать модели.

  • Во-вторых, Django пытается импортировать подмодуль моделей каждого приложения, если они есть.

  • В-третьих, Django запускает .ready() в каждой конфигурации приложения.

В core/__init__.py, Там есть care_team import, который, в свою очередь, импортирует этот from django.contrib.auth.models import User. Следует избегать импорта этой модели при инициализации на уровне приложения.

Это должно загружаться лениво. Или код необходимо отредактировать, чтобы никакая модель не была импортирована во время инициализации приложения.

Другие вопросы по тегам