Python Tastypie授权不完全授权?

Python Tastypie授权不完全授权?,python,django,tastypie,Python,Django,Tastypie,假设我们只想更新那些stage integer字段小于3的对象。(或者类似的例子,我们希望将对象更新权限仅限于所有者users=fields.foreignkey)。因此,第一个授权示例如下所示: class RecordAuthorization(Authorization): def update_detail(self, object_list, bundle): if bundle.obj.stage < 3: return True

假设我们只想更新那些stage integer字段小于3的对象。(或者类似的例子,我们希望将对象更新权限仅限于所有者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")
实际上,这两种方法都不起作用(我测试了第一种,但它不起作用)。 仔细查看Tastype文档时,他们会说:

对象列表是正在处理的对象的集合,作为 请求

这意味着在
object\u list
中,有json对象只重写到python的dict列表中?因此,数据库中没有真实的对象,因此此筛选:

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更新”属性

所以为了让事情顺利进行,我需要这样做:

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")

对于
update_list
object_list
参数将是一个查询集(或非Django ORM数据源的其他iterable),应进行筛选

对于
update\u detail
,您需要检查
bundle.obj
的属性,它是
资源.Meta.object\u类的实例,例如Django模型。如果设置了
Resource.Meta.queryset
,则会为您设置
Resource.Meta.object\u类


代码中存在缩进错误,您应该在方法级别而不是类级别引发未经授权的错误。如果解决不了问题,请发布您的资源。

对于
更新列表
对象列表
参数将是一个查询集(或其他适用于非Django ORM数据源的iterable),应进行筛选

对于
update\u detail
,您需要检查
bundle.obj
的属性,它是
资源.Meta.object\u类的实例,例如Django模型。如果设置了
Resource.Meta.queryset
,则会为您设置
Resource.Meta.object\u类


代码中存在缩进错误,您应该在方法级别而不是类级别引发未经授权的错误。如果解决不了问题,请发布您的资源。

我现在修复了缩进。我知道object_list将是一个queryset,bundle.obj将是模型实例(对于me-Django-ORM)。问题是update_list/detail中的object_list和bundle.obj都包含来自数据库和当前请求的数据=>API调用中指定的字段将覆盖数据库中的字段。对我来说(我也认为对一些人来说),这是一种意想不到的行为。我个人认为在这些方法中会有两种数据:来自数据库的数据和来自api调用的数据(补充了缺少字段的数据库),但我只得到后一种数据。当然,我可以自己查询数据库,但是当tastypie也查询数据库时,我认为它还可以保留数据库中的原始模型。特别是对于update_list函数来说,编写查询似乎很重要,因为我需要从queryset中提取id并使用这些id运行另一个查询。(如果queryset上有一个简单的函数可以重新运行它,请告诉我)我明白你的意思了。现在我只想做另一个查询。在下一个版本中,我将把原始对象添加到bundle中。问题是:我现在修复了缩进。我知道object_list将是一个queryset,bundle.obj将是模型实例(对于me-Django-ORM)。问题是update_list/detail中的object_list和bundle.obj都包含来自数据库和当前请求的数据=>API调用中指定的字段将覆盖数据库中的字段。对我来说(我也认为对一些人来说),这是一种意想不到的行为。我个人认为在这些方法中会有两种数据:来自数据库的数据和来自api调用的数据(补充了缺少字段的数据库),但我只得到后一种数据。当然,我可以自己查询数据库,但是当tastypie也查询数据库时,我认为它还可以保留数据库中的原始模型。特别是对于update_list函数来说,编写查询似乎很重要,因为我需要从queryset中提取id并使用这些id运行另一个查询。(如果queryset上有一个简单的函数可以重新运行它,请告诉我)我明白你的意思了。现在我只想做另一个查询。在下一个版本中,我将把原始对象添加到bundle中。问题是:
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")