gpt4 book ai didi

Django-guardian - 在哪里分配对象创建的默认权限

转载 作者:行者123 更新时间:2023-12-04 15:24:48 26 4
gpt4 key购买 nike

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

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 来处理所有各种组合和功能。

“创建者”权限分配给对象的初始创建者,他们可以通过基于电子邮件的邀请系统将其他权限分配给用户。

我的问题围绕着为创建对象分配创建者权限的选项。

到目前为止我想到的一些方法:

保存后在 View 中分配
newObject.save()
assign('creator', User, newObject)

一般来说,我更喜欢将这些类型的事件排除在我的观点之外。

覆盖 save()

这种方法的问题是我必须授予对 User 对象的保存访问权限,这意味着还要覆盖 初始化 设置 self.request = 请求。

post_save 信号

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

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

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

谢谢,

京东

最佳答案

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

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

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

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

希望有帮助!

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

关于Django-guardian - 在哪里分配对象创建的默认权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com