Регистрация сигналов в Django приводит к ошибке "Приложения еще не загружены".

Я продолжаю получать ошибку, когда пытаюсь импортировать сигналы:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Я не могу понять этого, потому что я успешно использовал следующий шаблон при настройке профиля пользователя в других приложениях:

models.py:

from django.conf import settings
from django.db import models

class UserProfile(models.Model):
  user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    

signals.py:

from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from my_project.my_app.models import UserProfile

def post_save_user_hander(sender, *args, **kwargs):
     created = kwargs.get("created", False)
     instance = kwargs.get("instance", None)
     if created and instance:
         UserProfile.objects.create(user=instance)


post_save.connect(
    post_save_user_hander, 
    sender=get_user_model(),
    dispatch_uid="post_save_user_handler",
)

app.py:

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_project.my_app'

    try:
        import my_project.my_app.signals  
    except ImportError:
        pass

Согласно документации, ready() вызывается "как только реестр будет полностью заполнен". Следовательно, импорт UserProfile не должен быть успешным? Также, в документации говорится

Хотя вы не можете импортировать модели на уровне модуля, где определены классы AppConfig классы определены, вы можете импортировать их в ready(), используя либо оператор оператора import или get_model().

Поэтому включение их в начало файла signals.py, который сам импортирован в ready(), должно работать, верно?

Попробуйте включить сигналы в метод AppConfig.ready.

from django.apps import AppConfig


class MyAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_project.my_app'

    def ready(self):
        import my_project.my_app.signals

Из документов по AppConfig.ready

Подклассы могут переопределить этот метод для выполнения задач инициализации, таких как регистрация сигналов. Он вызывается, как только реестр будет полностью заполнен.

Если вы регистрируете сигналы модели, вы можете ссылаться на отправителя по его строковой метке вместо использования самого класса модели.

Полагаю, что это обычный подход - включать сигналы в метод AppConfig.ready.

Вернуться на верх