Ошибка обновления Django 1.7: AppRegistryNotReady с использованием сериализаторов из rest_framework

Я получаю эту трассировку:

Traceback (most recent call last):
  File "./manage.py", line 38, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/apps/config.py", line 197, in import_models
    self.models_module = import_module(models_module_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/Users/mgregory/Documents/cm_central/cmh_server/models.py", line 88, in <module>
    class VersionSerializer(serializers.ModelSerializer):
  File "/Users/mgregory/Documents/cm_central/cmh_server/models.py", line 89, in VersionSerializer
    brzs= BrzSerializer(many=True)
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/rest_framework/serializers.py", line 198, in __init__
    self.fields = self.get_fields()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/rest_framework/serializers.py", line 234, in get_fields
    default_fields = self.get_default_fields()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/rest_framework/serializers.py", line 732, in get_default_fields
    reverse_rels = opts.get_all_related_objects()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/db/models/options.py", line 498, in get_all_related_objects
    include_proxy_eq=include_proxy_eq)]
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/db/models/options.py", line 510, in get_all_related_objects_with_model
    self._fill_related_objects_cache()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/db/models/options.py", line 533, in _fill_related_objects_cache
    for klass in self.apps.get_models(include_auto_created=True):
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
    result = user_function(*args, **kwds)
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/apps/registry.py", line 168, in get_models
    self.check_models_ready()
  File "/Users/mgregory/Documents/virtualenvs/cm_central/lib/python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

из этого кода (models.py):

# Serializers for transmitting CMx install information over HTTP

class BrzSerializer(serializers.ModelSerializer):
    class Meta:
        model = Brz
        fields=('filename',)

class VersionSerializer(serializers.ModelSerializer):
    brzs= BrzSerializer(many=True)
    class Meta:
        model = Version
        fields=('name', 'for_mac', 'for_windows', 'brzs')

Похоже, он говорит мне, что «ваш VersionSerializer не может иметь BrzSerializer, потому что вы еще не зарегистрировали его».

Я просмотрел другие вопросы SO, касающиеся AppRegisteryNotReady, но не нашел ни одного, соответствующего этому симптому. Конечно, я должен уметь определять цепочку зависимых моделей, подобных этой?


person GreenAsJade    schedule 19.10.2014    source источник


Ответы (1)


Оказывается, наличие объявления сериализаторов внутри models.py приводит к тому, что это приложение будет использоваться до того, как завершится загрузка реестра приложений.

models.py на самом деле неправильное место для объявления этих сериализаторов (хотя я на 99% уверен, что сделал это именно так, основываясь на примере их использования).

Исправление состоит в том, чтобы переместить объявление сериализаторов в их собственный файл (что имеет смысл, поскольку они не имеют ничего общего со схемой базы данных, которую определяет models.py) и импортировать ее из представления. К тому времени, когда представление заработает, реестр приложений будет готов.

person GreenAsJade    schedule 19.10.2014