在Tastypie有没有办法根据身份验证更改资源排除?

时间:2012-07-25 12:34:11

标签: tastypie

考虑具有配置文件pic和电子邮件字段的用户资源的示例。任何用户可能会看到任何其他用户个人资料照片,但用户只能看到他们自己的电子邮件地址。

是否可以设置tastypie,以便根据经过身份验证的用户改变排除字段集?

我意识到另一种方法是创建单独的完整和受限用户资源。但目前我只想知道基于用户身份验证限制字段的方法是否在tastypie中是可行的。

此外,它不一定是排除,同样可以根据请求用户更改字段属性吗?

3 个答案:

答案 0 :(得分:0)

我不认为排除的字段可以以优雅的方式重新出现在图片中。您可以通过在资源中包含get_object_list来使用某些对象操作来根据请求操作对象列表

但是,在自定义授权类中使用apply_limits方法会更好,也更符合逻辑。

答案 1 :(得分:0)

是的,有办法做到这一点。 如果您将电子邮件定义为单独的字段,而不是用户之一(可能正常工作,但从未这样做过)。 您可以定义dehydrate_email,其中bundle.request包含当前请求,您可以获取它。它不会被完全排除在一个字段之外,但对其他人来说将是无。

答案 2 :(得分:0)

我创建了一个ModelResource子类,它可以多次继承到所需的ModelResource实例中。像:

class ResourceThatNeedsToExcludeSomeFields(ExcludeResource, ModelResource):
    pass

通过GET参数排除字段(例如“& exclude = username”)

class ExcludeResource(ModelResource):
"""
Generic class to implement exclusion of fields in all the ModelResource classes
All ModelResource classes will be muliple inherited by this class, whose dehydrate method has been overriden
"""
# STACK: How to exclude some fields from a resource list created by tastypie?
def dehydrate(self, bundle):
    # I was taking the exclude fields from get paramaters as a comma separated value
    if bundle.request.GET.get('exclude'):
        exclude_fields = bundle.request.GET.get('exclude').split(',')
        for field in exclude_fields:
            if str(field) in bundle.data.keys():
                del bundle.data[str(field)]
    return bundle

您可以修改此项以根据用户组(或基于字段的任何条件)获取排除字段,如下所示:

class ExcludeResource(ModelResource):
"""
Generic class to implement exclusion of fields in all the ModelResource classes
All ModelResource classes will be muliple inherited by this class, whose dehydrate method has been overriden
"""
# STACK: How to exclude some fields from a resource list created by tastypie?
def dehydrate(self, bundle):
    exclude_fields = <get a comma separated list of fields to be excluded based in bundle.request.user>
    for field in exclude_fields:
        if str(field) in bundle.data.keys():
            del bundle.data[str(field)]
    return bundle

但是,此代码段不适用于使用“full = True”

指定的相关资源