2015-07-11 93 views
4

我通过在Django模型中使用'meta'来添加自定义权限。看下面的一个简单的例子。Django元权限

Models.py

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

这个伟大的工程,我上面的代码添加到模型,然后让我的迁移,然后将其迁移。权限被创建并可供使用。

但是,当我从我的模型的'meta'部分删除(或修改)该权限并再次从Django系统删除权限(已删除/修改)makemigrations,migrate

这不会是一个问题,如果我已经想出了我的权限系统100%,但我一直在进行微调,因为我学习的结果是权限列表与'传统'权限混乱。

我正在开发和发布新版本,以便频繁使用,并且权限在生产中越来越混乱,我不能像在开发中那样擦除数据库。

有没有推荐的方法呢?

我可以直接从数据库手动删除旧的权限(它似乎只是一个条目,我需要删除,它似乎不会导致任何问题)。这似乎是一个糟糕的做法,容易出错,被遗忘等。

+0

您是否尝试过对模型进行其他修改以确保创建了新迁移,并检查了此处未删除权限?编辑:我发现了一个[关闭的问题](https://code.djangoproject.com/ticket/23256),看起来它已被修复。 – guival

回答

0

您是否尝试过向后移动而不是向前移动?

<app_label> <migrationname>:将数据库架构带到应用了指定迁移的状态,但是不会在同一应用程序中应用更高版本的迁移。如果您之前已迁移过指定的迁移,则可能涉及不应用迁移。使用名称零来取消应用程序的所有迁移。

我的猜测是,makemigrations命令扫描模式的权限元,并产生权限表中的“插入” SQL对每个缺少PERMSSION,它实际上并没有做的迁移脚本的双向同步。

但是,迁移脚本可以使用'delete'语句为每个'insert'恢复更改。

所以尝试:

python manage.py migrate the_app the_migration_before_the_last 

如果这也不行,提交bug到Django项目。