django - Django-清除权限表

标签 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管理中同时拥有这两个权限,这对用户-管理员来说确实令人困惑。

最佳答案

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

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


然后,您可以从那里控制一切。

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

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

最简单的方法是在管理站点中注册Permission对象,因此您可以从那里进行控制。您仍然需要在两个地方(models.py和您的数据库)都进行更改以进行任何名称更改,但是管理站点使此操作变得更加容易。

请记住,您创建的额外的Permission对象(“更新”)具有一个新的pk,这意味着,如果您只删除较早的Permission对象(“ edit”),它将对其与之相关的任何事物产生影响。如果您不想丢失数据,建议您编写一个脚本以合并两个Permission对象,以避免出现任何错误

关于django - Django-清除权限表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17858199/

相关文章:

python - django(但实际上是 python)关于元组的古玩

python - 如何一次获得所有 Django 外键对象?

python - Django:在允许用户注册之前检查用户是否已登录?

unix - 以不同于 ssh key 所有者的用户身份使用 rsync+ssh+public key 同步本地和远程目录

permissions - Hudson 可以配置为阻止某些用户访问某些项目吗?

angular - 您如何使用 MSAL-ANGULAR 读取角色/权限

permissions - 创建自定义声明类型的最佳实践

django - 如何设置Django对象实例权限?

python - 过滤通用外键

c# - 使用 PolicyKit 让我的应用程序访问受限文件