Django - 清洁权限表

Tom*_*chý 11 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'),
        )
Run Code Online (Sandbox Code Playgroud)

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

./manage update_permissions
Run Code Online (Sandbox Code Playgroud)

但后来我意识到,最好给它命名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'),
        )
Run Code Online (Sandbox Code Playgroud)

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

yuv*_*uvi 28

简短回答:在管理站点注册权限.将此添加到您的admin.py文件:

from django.contrib.auth.models import Permission
admin.site.register(Permission)
Run Code Online (Sandbox Code Playgroud)

然后你从那里控制一切.

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

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

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

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