我想在手动编写的迁移中添加一些组并为其分配权限,但如果我在干净的DB上运行它,则只有在运行所有迁移后才会创建权限.
我找到了这张票:https: //code.djangoproject.com/ticket/23422但我不能在那里发表评论(我可能会在表达对GeoDjango文档的不满之后被禁止),所以我将分享对解决方案的改进在下面.
我向我的模型添加了新权限,然后使用了manage.py makemigrations。它创建了一个改变模型选项(特别是权限......)的迁移。
后来,我添加了一个依赖于第一个迁移的迁移,并使用了权限(我相信创建的第一个迁移)。该迁移使用了查询 auth_permissions 的 RunSQL 操作中的权限。
当我调试迁移时 - 我意识到只有在应用所有迁移之后才会插入身份验证权限。
含义 - 当我尝试查询权限的 id 以便在第二次迁移中使用它时 - 它不存在,因此第二次迁移不会按预期运行。
知道为什么会发生这种情况以及如何预防吗?我在添加新权限时的假设是,它将与 django 为我创建的迁移一起添加......而不是在不同的阶段。
谢谢!
我试图按照此添加新的迁移教程
我增加了新的权限内Meta到permissions现场。然后,我创建了迁移,并尝试修改此迁移以适当地更新组权限。但得到DoesNotExist的RunPython操作。
from django.db import migrations
def assign_new_permission(apps, *args):
Permission = apps.get_model('auth.Permission')
Group = apps.get_model('auth.Group')
# __fake__.DoesNotExist: Permission matching query does not exist.
new_permission = Permission.objects.get(
codename='my_new_permissoin_code')
admins = Group.objects.get(name='Group name')
admins.permissions.add(new_permission)
class Migration(migrations.Migration):
dependencies = [
('my_app', '0066_some_migratoin'),
]
operations = [
migrations.AlterModelOptions(
name='my_model',
options={'permissions': (('my_new_permissoin_code',
'Permission name'),)},
),
migrations.RunPython(assign_new_permission)
]
Run Code Online (Sandbox Code Playgroud)