首页 > 解决方案 > Django 数据库迁移:删除无法正常工作

问题描述

我在 Ubuntu 18.04 中使用 Django 2.2 和 psql 10.12。在迁移时,我试图删除数据库表 auth_permission 中的一些行。

from django.db import migrations
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q


def remove_rows_at_migrate(apps, schema_editor):
    try:
        permission_model = apps.get_model("auth", "Permission")
        db_alias = schema_editor.connection.alias
        permissions = permission_model.objects.using(db_alias).filter(Q(name='Can do X') |
                                                                  Q(name='Can do Y'))

        for perm in permissions:
            print("deleting: {}".format(perm.name))
            perm.delete()

    except (ObjectDoesNotExist, ValueError):
        pass


class Migration(migrations.Migration):
    dependencies = [
        ('abc', 'xxx'),
    ]

    operations = [
        migrations.RunPython(remove_rows_at_migrate)
    ]

当我迁移时,应用迁移并且结果是 [OK] 但是当我检查表 auth_persmission “Can do X”和“Can do Y”仍然在具有新“id”的表中。

我可以在 manage.py shell_plus 中从同一个表中删除行,而不会出现以下问题:

>>> permissions = Permission.objects.filter(Q(name='Can do X') |Q(name='Can do Y'))
>>> permissions.delete()

什么可能导致这种行为?

标签: djangodatabasemigrationdatabase-migration

解决方案


因为permissions是使用post_migrate信号而不是迁移创建的,请参阅此处的讨论


推荐阅读