В источнике Django , отсюда и происходит исключение:
def check_apps_ready(self):
"""Raise an exception if all apps haven't been imported yet."""
if not self.apps_ready:
raise AppRegistryNotReady("Apps aren't loaded yet.")
Как видите, убедитесь, что все приложения готовы (загружены). В общем, когда это связано с сигналами , обычно это происходит в 2 ситуациях.
Круговой импорт
Убедитесь, что в вашем проекте их нет. Это может вызвать ошибку.
Регистрация сигнала перед загрузкой приложения
См. this для получения дополнительной информации. Но одна вещь, которая помогает мне понять, как Django работает за кулисами, это утверждение:
Важно понимать, что приложение Django - это просто набор кода, который взаимодействует с различными частями фреймворка. Там нет такого понятия, как объект приложения. Однако есть несколько мест, где Django необходимо взаимодействовать с установленными приложениями, в основном для настройки, а также для самоанализа. Вот почему реестр приложений поддерживает метаданные в экземпляре AppConfig для каждого установленного приложения.
Следовательно, вы можете переопределить один из AppConfig
методов, называемых AppConfig.ready()
, которые позволяют вам выполнять задачи инициализации, такие как регистрация сигналов.
# yourApp/__init__.py
default_app_config = 'yourappname.apps.YourAppConfig'
# yourApp/apps.py
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourappname'
def ready(self):
from yourappname import signals
Дополнительная информация
Для объяснения, это рекомендуемый способ, начиная с Django 1.7+, который, скорее всего, ваш случай. Логика заключается в том, что реестр приложений содержит логическое значение ready
, которое устанавливается на True
только после полного заполнения реестра и вызова всех AppConfig.ready()
методов.