“没有安装带有‘admin’标签的应用程序"运行 Django 迁移.该应用程序已正确安装

问题描述

我正在尝试在 Django 1.7 上进行数据迁移期间使用 admin.LogEntry 对象

I am trying to use admin.LogEntry objects during a datamigration on Django 1.7

'django.contrib.admin' 应用程序列在 INSTALLED_APPS 上.

The 'django.contrib.admin' app is listed on INSTALLED_APPS.

在外壳上,它可以工作:

On the shell, it works:

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

但是在迁移过程中,它失败了:

But during the migration, it fails:

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

这样失败:

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

使用调试器,我发现管理员"没有安装:

Using a debugger, I got that the 'admin' is not installed:

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']

为什么??


解决方案

Django doc 说得很清楚:

当编写一个 RunPython 函数使用来自迁移所在应用之外的其他应用的模型时,迁移的 dependencies 属性应包含每个应用的最新迁移,否则当您尝试使用 RunPython 函数检索模型时,您可能会收到类似于:LookupError: No installed app with label 'myappname'strong>apps.get_model().

When writing a RunPython function that uses models from apps other than the one in which the migration is located, the migration’s dependencies attribute should include the latest migration of each app that is involved, otherwise you may get an error similar to: LookupError: No installed app with label 'myappname' when you try to retrieve the model in the RunPython function using apps.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),
    ]

相关文章