在开发应用和模型期间,有时会删除或重命名权限。什么是从权限表中清除剩余物而不破坏某些东西的好方法?
例如:我有一个应用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管理中既有权限又对用户 - 管理员来说真的很混乱。
答案 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对象以避免任何错误