Django - 清洁权限表

时间:2013-07-25 12:35:58

标签: django permissions

在开发应用和模型期间,有时会删除或重命名权限。什么是从权限表中清除剩余物而不破坏某些东西的好方法?

例如:我有一个应用articles,其模型Article具有一些权限。

class Article(models.Model):
    title = ...
    text = ...

    class Meta:
        permissions = (
            ('can_edit_title', 'Can edit title of article'),
            ('can_edit_text', 'Can edit text of article'),
        )

我通过命令添加此权限(已安装django_extension):

./manage update_permissions

但后来我意识到,最好将其命名为can_update_title。所以我改变了模型:

class Article(models.Model):
    ...

    class Meta:
        permissions = (
            ('can_update_title', 'Can update title of article'),
            ('can_update_text', 'Can update text of article'),
        )

当我更新权限时,Django管理中既有权限又对用户 - 管理员来说真的很混乱。

1 个答案:

答案 0 :(得分:24)

简答:在管理网站上注册权限。将其添加到您的admin.py文件中:

from django.contrib.auth.models import Permission
admin.site.register(Permission)

然后你从那里控制一切。

答案很长:权限是对象,就像django中的其他内容一样。它们保存到数据库,并通过ManyToMany关系链接到用户和组。当您只是更改了Article模型的Meta类中的权限名称时,django无法知道您仍然像以前一样使用相同的对象,因此它创建了一个新对象。

您应该做的是,在更改模型中的权限名称后,还要更改数据库中关联权限对象的名称。

最简单的方法是使用管理站点注册Permission对象,这样您就可以从那里进行控制。您仍然需要在两个地方(models.py和您的数据库)更改它以进行任何名称更改,但管理网站使这更容易。

请记住您创建的额外Permission对象('update')有一个新的pk,这意味着如果您只是删除旧的Permission对象('edit'),它会对与它有关系的任何东西。如果您有不想丢失的数据,我建议编写一个脚本来合并两个Permission对象以避免任何错误