Django обновление с 1.8 до 1.9 прерывается при импорте модели в init - PullRequest
0 голосов
/ 27 января 2020

Я столкнулся с той же проблемой, что @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 Ответ

2 голосов
/ 28 января 2020

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

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

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

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

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

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

...