我正在启动一个具有复杂权限结构的应用程序,该结构将不可避免地由用户自己管理。我在模型中具有以下权限:
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)
[通常,我更喜欢从我的观点中排除这些类型的事件。
覆盖save()
此方法的问题是我必须授予对User对象的保存访问权限,这意味着也要覆盖init来设置self.request = request。
保存后的信号
我知道我可以利用这个信号,但是与前两个信号相比,我还没有尝试实现此信号。
希望这能提供我对事物处境的足够了解。
我很想知道这些方法中最好的是什么,或者,如果它们都是坏主意,那么什么是替代实现。
谢谢,
JD
AD Override save():您可以将[[user参数添加到save
方法中(因此也不必覆盖init
)。如果您尝试在不传递user实例的情况下调用save
方法,这种方式的代码将在运行时中断(并且只要测试您的代码,就可以使用该方法)。
AD post_save signal:如果您没有尝试,请尝试!有关信号主题的文档非常好,而且很容易学习。可能比较棘手的是您应该在哪里连接信号(我更愿意在models
模块的末尾进行连接)。不幸的是,没有最佳的答案。另外,请记住,如果您使用原始SQL插入实例或执行save
(post_save
),则不会触发bulk_create
方法和https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create信号。因此,确定要进行自动权限分配的位置(无论如何都应该是一个位置)。或者],您可以将指向creator的FK字段添加到模型中。您将能够使用该信息,而不用向监护人检查权限(并且正如您所提到的,使用实际上也很适合您的问题的混合)。不久前,我在项目管理应用程序中使用了这种方法。
希望有帮助!https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-create