"Нет установленного приложения с меткой "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')
к зависимостям и миграции должны идти хорошо.