考虑具有配置文件pic和电子邮件字段的用户资源的示例。任何用户可能会看到任何其他用户个人资料照片,但用户只能看到他们自己的电子邮件地址。
是否可以设置tastypie,以便根据经过身份验证的用户改变排除字段集?
我意识到另一种方法是创建单独的完整和受限用户资源。但目前我只想知道基于用户身份验证限制字段的方法是否在tastypie中是可行的。
此外,它不一定是排除,同样可以根据请求用户更改字段属性吗?
答案 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”
指定的相关资源