在开发过程中,有时会删除或重命名应用和模型的权限。什么是从权限表中清除剩余而不破坏某些内容的好方法?
例如:我有一个模型为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/