让我们说我们希望能够只更新阶段整数字段低于3的那些对象。(或者类似的例子,我们想要将对象的权限仅限制更新为Owner users = fields .foreignkey)。因此,第一个示例授权将如下所示:
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")
实际上它们都不会起作用(我测试了第一个并且它不起作用)。 仔细观察tastypie文档时,他们会说:
object_list是正在处理的对象的集合 请求。
所以这意味着在object_list
中,只有json对象重写为python的dicts列表?所以没有来自数据库的真实对象,因此这个过滤:
def update_list(self, object_list, bundle):
return object_list.filter(stage__lt=3)
将无法按预期工作(仅允许对阶段低于3的对象进行更新)。并会做类似的事情 - &gt;如果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")
答案 0 :(得分:0)
对于update_list
,object_list
参数将是一个应该被过滤的查询集(或非Django ORM数据源的其他可迭代的)。
对于update_detail
,您要检查bundle.obj
的属性,这是Resource.Meta.object_class
的一个实例,例如Django模型。如果您设置Resource.Meta.queryset
,则会为您设置Resource.Meta.object_class
。
您的代码中存在缩进错误,您应该在方法级别而不是类级别提升未授权。如果修复无法解决问题,请发布您的资源。