我正在启动一个具有复杂权限结构的应用程序,该结构将不可避免地由用户自己管理。我在模型中拥有以下权限:
class Meta:
permissions = (
('can_view', 'View project'),
('manage_view', 'Can assign View project'),
('can_edit', 'Edit project'),
('manage_edit', 'Can assign Edit project'),
('can_delete', 'Delete project'),
('manage_delete', 'Can assign Delete project'),
('creator', 'Full access to model features.'),
)
这些将使用Django-guardian在对象级别进行管理,我使用自定义mixins来处理所有各种组合和功能。
“创建者”权限被分配给对象的初始创建者,并且他们可以通过基于电子邮件的邀请系统将其他权限分配给用户。
我的问题围绕着选项,用于在创建对象时分配创建者权限。
到目前为止我想到的一些方法:
保存后在视野中分配
newObject.save()
assign('creator', User, newObject)
一般来说,我更喜欢从我的观点中获取这些类型的事件。
覆盖保存()
此方法的问题是我必须提供对User对象的保存访问权限,这意味着还要覆盖 init 以设置self.request = request。
post_save信号
我知道我可以利用这个信号,但与之前的两个相比,我还没有尝试过这个。
希望这能充分展示我对事物的处理方式。
我很想知道这些方法中最好的方法是什么,或者,如果它们都是坏主意,那么替代实现可能是什么。
谢谢,
JD
答案 0 :(得分:3)
AD覆盖保存():您可以将用户参数添加到save
方法(因此您也不必覆盖init
)。这样,如果你尝试在不传递 user 实例的情况下调用save
方法,代码会在运行时中断(并且只要你测试代码就可以使用这种方法)。
AD post_save信号:如果你没试过......试试吧!关于信号主题的文档非常好,它们很容易学习。可能棘手的是你应该在哪里连接信号(我更喜欢在模型模块的末尾那样做)。
不幸的是,没有最好的方法来回答你。此外,请记住,如果您使用原始SQL插入实例或执行save
(https://docs.djangoproject.com/en/1.4),则不会触发post_save
方法和bulk_create
信号。 / REF /模型/查询集/#批量创建)。因此,要确定您希望进行此自动权限分配的地方(无论如何,这应该是一个地方)。
或者,您可以将指向创建者的FK字段添加到模型中。您将能够使用该信息而不是使用监护人检查权限(并且您注意到使用的mixin也应该很适合您的问题)。我不久前在项目管理应用程序中使用了这种方法。
希望有所帮助!
https://docs.djangoproject.com/en/1.4/ref/models/querysets/#bulk-create