Django元权限

4
我正在使用Django模型中的“meta”添加自定义权限。请参见下面的简单示例。

Models.py

class Meta:
    permissions = (
        ("can_do_stuff", "Can do stuff"),
    )

这很好用,我将上述代码添加到模型中,然后进行迁移。权限会被创建并可供使用。

但是,当我从我的模型的“meta”部分中删除(或修改)该权限,然后再次执行makemigrationsmigrate时,被删除/修改的权限不会从Django系统中删除。

如果我已经完全弄清了权限系统,这就不是问题了,但是随着学习和微调,权限列表变得混乱不堪。

我正在频繁地开发和发布新版本以供生产使用,而权限在生产环境中变得混乱,无法像在开发环境中那样轻松清除数据库。

有没有推荐的方法来做到这一点?

我可以直接从数据库中手动删除旧权限(似乎只需要删除一个条目,而且似乎不会造成任何问题)。但这似乎是一种不好的做法,容易出错,被遗忘等。


你尝试过对模型进行其他修改以确保创建新的迁移,并检查此处是否未删除权限吗?编辑:我在这个问题上找到了一个已关闭的问题(https://code.djangoproject.com/ticket/23256),看起来它已经被修复了。 - gdvalderrama
1个回答

0

你尝试过向后迁移而不是向前吗?

<app_label> <migrationname>:将数据库模式带到应用了指定迁移的状态,但同一应用程序中没有应用更晚的迁移。如果您以前已经迁移到指定的迁移,则可能涉及取消应用迁移。使用名称“zero”来取消应用该应用程序的所有迁移。

我猜测makemigrations命令会扫描模型的权限元数据,并为每个缺失的权限在Permission表中生成一个'insert' SQL,它实际上并没有在迁移脚本中进行双向同步。

但是迁移脚本可以通过每个'insert'语句的'delete'语句来撤消更改。

所以尝试:

python manage.py migrate the_app the_migration_before_the_last

如果这个方法还是不行的话,请向Django项目提交一个bug。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接