如何将queryset建立在当前用户django-rest序列化程序的基础上



我正在尝试创建一个带有DRF的序列化程序,该程序能够验证用户是否有权访问primarykeyrelatedfield条目。我有一个单独的函数,它返回用户可以访问的文件的查询集。作为一个参数,它所需要的只是请求对象。我想使用这个函数作为primarykeyrelated字段的queryset-karg。然而,我找不到访问";自我;在这个位置,所以似乎没有办法定义依赖于序列化程序的当前用户的Queryset。

这是我当前的尝试,但失败了,因为当调用_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

这似乎有点低效,因为它最终会对每个文件查询两次,但它达到了用户只能访问他们特定请求的文件的效果

最新更新