如何基于当前用户的查询集 django rest 序列化程序
How to base queryset off of current user django rest serializer
我正在尝试使用 DRF 创建一个序列化程序,它能够验证用户是否有权访问 primarykeyrelatedfield 条目。
我有一个单独的函数,它 returns 用户可以访问的文件的查询集。作为参数,它所需要的只是请求对象。我想将此函数用作主键相关字段的查询集 kwarg。
但是,我找不到在这个位置访问“self”的方法,所以似乎没有办法定义一个查询集,它依赖于序列化程序的当前用户。
这是我目前的尝试,但失败了,因为在调用 _request(self) 时我无法访问 self。
class MySerializer(serializers.Serializer):
def _request(self):
request = getattr(self.context, 'request', None)
if request:
return request
files = serializers.PrimaryKeyRelatedField(many=True, required=True, queryset=get_user_files(_request(self)))
我想验证用户是否有权访问他们在请求中引用的文件。我该怎么做?
我最终选择了一个比我想要的稍微不那么干净的答案:
class MySerializer(serializers.Serializer):
files = serializers.PrimaryKeyRelatedField(many=True, required=True, queryset=ScanFile.objects.all())
def validate_files(self, value):
request = self.context.get('request')
queryset = get_user_files(request)
for file in value:
if not queryset.filter(pk=file.id).exists():
raise ValidationError({'Invalid file': file})
return value
这似乎有点低效,因为它最终会为每个文件查询两次,但它实现了用户只能访问他们明确请求的文件的效果。
我正在尝试使用 DRF 创建一个序列化程序,它能够验证用户是否有权访问 primarykeyrelatedfield 条目。 我有一个单独的函数,它 returns 用户可以访问的文件的查询集。作为参数,它所需要的只是请求对象。我想将此函数用作主键相关字段的查询集 kwarg。 但是,我找不到在这个位置访问“self”的方法,所以似乎没有办法定义一个查询集,它依赖于序列化程序的当前用户。
这是我目前的尝试,但失败了,因为在调用 _request(self) 时我无法访问 self。
class MySerializer(serializers.Serializer):
def _request(self):
request = getattr(self.context, 'request', None)
if request:
return request
files = serializers.PrimaryKeyRelatedField(many=True, required=True, queryset=get_user_files(_request(self)))
我想验证用户是否有权访问他们在请求中引用的文件。我该怎么做?
我最终选择了一个比我想要的稍微不那么干净的答案:
class MySerializer(serializers.Serializer):
files = serializers.PrimaryKeyRelatedField(many=True, required=True, queryset=ScanFile.objects.all())
def validate_files(self, value):
request = self.context.get('request')
queryset = get_user_files(request)
for file in value:
if not queryset.filter(pk=file.id).exists():
raise ValidationError({'Invalid file': file})
return value
这似乎有点低效,因为它最终会为每个文件查询两次,但它实现了用户只能访问他们明确请求的文件的效果。