"Нет установленного приложения с меткой "admin "" запуск миграции Django. Приложение установлено правильно

Я пытаюсь использовать admin.LogEntry объекты во время datamigration на Django 1.7

на 'django.contrib.admin' приложение размещено на INSTALLED_APPS.

на корпусе, работает:

>>> from django.apps import apps
>>> apps.get_model('admin', 'LogEntry')
django.contrib.admin.models.LogEntry

но во время миграции он терпит неудачу:

def do_it(apps, schema_editor):
    LogEntry = apps.get_model('admin', 'LogEntry')

не так:

django-admin migrate
(...)
LookupError: No installed app with label 'admin'.

используя отладчик, я получил, что "admin" не установлен:

ipdb> apps.get_apps()
[]
ipdb> apps.all_models.keys()
['website', 'google', 'allauth', 'twitter', 'busca', 'conteudo', 'django_mobile', 'django_filters', 'videocenter', 'tinymce', 'oferta', 'programacaotv', 'contenttypes', 'suit', 'haystack', 'destaque', 'filer', 'galeria', 'auth', 'facebook', 'paintstore', 'critica', 'disqus', 'fichas', 'omeletop', 'autocomplete_light', 'modelsv1', 'temas', 'django_extensions', 'adv_cache_tag', 'taggit', 'social', 'personalidade']

почему??

2 ответов


на Django doc дает понять:

при написании RunPython функция, которая использует модели из приложений, отличных от того, в котором находится миграция,зависимости атрибут должен включать последнюю миграцию каждого приложения, которое участвует, в противном случае вы можете получить ошибку, похожую на: LookupError: нет установленного приложения с меткой "myappname" при попытке получить модель в RunPython функция с помощью приложения.get_model().

пример кода:

# Imports are omitted for the sake of brevity

def move_m1(apps, schema_editor):
    LogEntry = apps.get('admin.logentry')
    # Other business logic here ...


class Migration(migrations.Migration):

    dependencies = [
        ('app1', '0001_initial'),

        # Below is the manually added dependency, so as to retrieve models
        # of 'django.contrib.admin' app with apps.get_model() in move_m1().
        #
        # Currently this is for Django 1.11. You need to look into
        # 'django/contrib/admin/migrations' directory to find out which is
        # the latest migration for other version of Django.
        ('admin', '0002_logentry_remove_auto_add'),
    ]

    operations = [
        migrations.RunPython(move_m1),
    ]

Я не знаю точной причины этого. Придется покопаться в исходном коде. но пока обходной путь-add ('admin', 'name_of_last_migration_in_admin_app') к зависимостям и миграции должны идти хорошо.