7

我正在启动一个具有复杂权限结构的应用程序,这将不可避免地由用户自己管理。我在模型中有以下权限:

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 信号

我知道我可以利用这个信号,但与前两个相比,我还没有尝试过实现它。

希望这能提供足够的洞察力来了解我在哪里做的事情。

我很想知道这些方法中最好的方法是什么,或者,如果它们都是坏主意,那么替代实现可能是什么。

谢谢,

京东

4

1 回答 1

4

AD Override save():您可以将用户参数添加到save方法中(因此您也不必重写init)。save如果您尝试在不传递用户实例的情况下调用方法,这种方式代码会在运行时中断(并且只要您测试您的代码,您应该可以使用该方法)。

AD post_save 信号:如果你没有尝试过......试试吧!关于信号主题的文档非常好,而且它们很容易学习。可能棘手的是您应该在哪里连接信号(我更喜欢在模型模块的末尾这样做)。

不幸的是,您的答案没有最佳方法。另外,请记住,如果您使用原始 SQL 插入实例或执行(https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create) ,则不会触发save方法或信号。因此,请确定您希望发生这种自动权限分配的位置(无论如何这应该是一个地方)。post_savebulk_create

或者,您可以将指向创建者的 FK 字段添加到模型中。您将能够使用该信息而不是检查监护人的许可(并且正如您所指出的那样,使用实际上也应该很好地解决您的问题的混入)。前段时间我将这种方法用于我的项目管理应用程序。

希望有帮助!

https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create

于 2012-11-07T22:26:07.230 回答