【发布时间】:2016-02-14 12:18:43
【问题描述】:
假设我们希望能够仅更新阶段整数字段小于 3 的那些对象。(或类似的示例,我们希望将对象更新的权限限制为所有者 users=fields .外键)。所以第一个示例授权将如下所示:
class RecordAuthorization(Authorization):
def update_detail(self, object_list, bundle):
if bundle.obj.stage < 3:
return True
raise Unauthorized("You can't update this")
或第二个例子:
class RecordAuthorization(Authorization):
def update_detail(self, object_list, bundle):
if bundle.obj.user == bundle.request.user:
return True
raise Unauthorized("You can't update this")
实际上它们都不起作用(我测试了第一个但它不起作用)。 当您仔细查看 sweetpie 文档时,他们会说:
object_list 是正在处理的对象的集合,作为 请求。
所以这意味着在object_list 中,有json 对象只重写为python 字典列表?所以没有来自数据库的真实对象,因此这个过滤:
def update_list(self, object_list, bundle):
return object_list.filter(stage__lt=3)
不会按预期工作(只允许更新阶段低于 3 的对象)。并且会做类似-> 如果 json(通过 API 发送,而不是数据库中的对象)阶段低于 3 允许更新。因此,实际上您可以将 stage=5(在数据库中)的对象更新为 stage=1! 对于 update_detail 函数,我也得到了同样奇怪的结果。所以我怀疑 bundle.obj 也是对象,但已经具有“json-updated”属性。
所以为了让事情顺利进行,我需要这样做:?!
class RecordAuthorization(Authorization):
def update_detail(self, object_list, bundle):
if User.objects.get(pk=bundle.obj.user.pk) == bundle.request.user:
return True
raise Unauthorized("You can't update this")
【问题讨论】: