django - 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()
什么可能导致这种行为?
解决方案
因为permissions
是使用post_migrate
信号而不是迁移创建的,请参阅此处的讨论
推荐阅读
- android - 如何使用其 REST API 在 Android 上访问 Google Drive 上的应用程序数据
- javascript - 使用 javascript 向元素添加事件侦听器
- c# - Virustotal Trapmine 可疑.low.ml.score
- c++ - 是否可以将 X 的容器声明为 X 的成员
- android - 使用 ndk arm-linux-androideabi-clang++ 编译器为 android 构建 grpc C++
- javascript - 空调功能
- css - 在引导程序 4 中关闭折叠的导航栏后,导航栏项目仍然可见一段时间
- python - 无法写入 TensorArray 索引,因为值形状与 TensorArray 的推断元素形状不兼容
- javascript - console.log 返回 [object Object]
- php - 卡在通知系统上