考虑具有个人资料图片和电子邮件字段的用户资源的示例。任何用户都可以看到任何其他用户的个人资料图片,但用户只能看到他们自己的电子邮件地址。
是否可以设置tastepie,以便排除字段集可以根据经过身份验证的用户而变化?
我意识到另一种方法是创建单独的完整和受限用户资源。但目前我只想知道基于用户身份验证限制字段的方法是否甚至在美味派中可行。
此外,它不一定是排除项,同样有没有办法根据请求用户更改字段属性?
考虑具有个人资料图片和电子邮件字段的用户资源的示例。任何用户都可以看到任何其他用户的个人资料图片,但用户只能看到他们自己的电子邮件地址。
是否可以设置tastepie,以便排除字段集可以根据经过身份验证的用户而变化?
我意识到另一种方法是创建单独的完整和受限用户资源。但目前我只想知道基于用户身份验证限制字段的方法是否甚至在美味派中可行。
此外,它不一定是排除项,同样有没有办法根据请求用户更改字段属性?
我认为排除的字段不能以优雅的方式重新出现。您可以通过get_object_list
在资源中包含一些对象操作来根据请求操作对象列表
apply_limits
但是,在您的自定义授权类中使用该方法会更好、更合乎逻辑。
我创建了一个 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”指定的相关资源
是的,有办法做到这一点。如果您将电子邮件定义为一个单独的字段,而不是用户的一个(可能可以使用,但从未这样做过)。您可以定义 dehydrate_email 其中 bundle.request 包含当前请求并且您可以获得它。它不会被完全排除为一个字段,但对其他人来说它将是 None 。