Обновление 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
. Следует избегать импорта этой модели при инициализации на уровне приложения.
Это должно загружаться лениво. Или код необходимо отредактировать, чтобы никакая модель не была импортирована во время инициализации приложения.