django.core.exceptions.AppRegistryNotReady: приложения еще не загружены. инициализация файла - PullRequest
0 голосов
/ 28 июня 2018

django.core.exceptions.AppRegistryNotReady: приложения еще не загружены.

Исключение появилось, когда я добавил:

  1. import signals в init .py файл (apps / application / init.py)

  2. from models import Review в файле signal.py (apps / application / signal.py)

Я хочу отправить http-запрос, когда в обзоре модели есть вставка.

Поэтому мне нужно импортировать модель Review (в файле __init.py__), чтобы выполнить следующий код:

@receiver (pre_save, sender = Review)
def my_handler (sender, ** kwargs):
       ....

1 Ответ

0 голосов
/ 28 июня 2018

В источнике 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() методов.

...