Исключение AppRegistryNotReady

Исключение AppRegistryNotReady наследуется от RuntimeError и возникает в Django, когда код пытается получить доступ к реестру приложений (django.apps.apps) до того, как все приложения будут полностью загружены и реестр инициализирован. Это часто происходит при использовании моделей или вызове get_model на ранних этапах загрузки Django.

Синтаксис

pythonfrom django.core.exceptions import AppRegistryNotReady

# Исключение возникает автоматически при попытке
# использования models до инициализации приложений

Пример

Рассмотрим код, который вызывает исключение при попытке получить модель до загрузки приложений:

pythonfrom django.apps import apps

# Попытка получить модель до инициализации реестра
try:
  model = apps.get_model('myapp', 'Article')
except AppRegistryNotReady as e:
  print(f"Error: {e}")

Результат выполнения кода:

python"Error: The app registry is not ready yet"

Пример

Частая ошибка возникает при использовании моделей в глобальной области видимости файла models.py или в декораторах:

pythonfrom django.db import models
from django.contrib.auth.models import User

# Ошибка может возникнуть при импорте модели
# на этапе загрузки приложений

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  bio = models.TextField()

# Попытка выполнить запрос к модели на уровне модуля
# вызовет AppRegistryNotReady
# users = User.objects.all()  # Не делайте так!

Результат выполнения кода:

python"django.core.exceptions.AppRegistryNotReady: The app registry is not ready yet"

Пример

Правильный способ отложить выполнение кода до момента готовности реестра приложений с использованием сигнала ready:

pythonfrom django.apps import AppConfig
from django.db.models.signals import post_migrate

class MyAppConfig(AppConfig):
  default_auto_field = 'django.db.models.BigAutoField'
  name = 'myapp'
  
  def ready(self):
    # Код выполняется после полной инициализации приложений
    from myapp.models import Article
    print(f"App is ready, found {Article.objects.count()} articles")

Результат выполнения кода:

python"App is ready, found 10 articles"

Пример

Использование функции apps.get_models внутри метода ready для работы со всеми моделями:

pythonfrom django.apps import AppConfig, apps

class BlogConfig(AppConfig):
  default_auto_field = 'django.db.models.BigAutoField'
  name = 'blog'
  
  def ready(self):
    # Безопасное получение всех моделей приложения
    models = apps.get_models()
    for model in models:
      print(f"Model: {model.__name__}")

Результат выполнения кода:

python"Model: Article"
"Model: Comment"
"Model: Category"

Смотрите также

  • исключение DoesNotExist,
    возникающее при отсутствии запрашиваемого объекта
  • исключение FieldError,
    возникающее при некорректном указании поля в запросе
  • исключение IntegrityError,
    возникающее при нарушении целостности данных
  • исключение ImproperlyConfigured,
    возникающее при некорректной настройке Django