如何基于当前用户的查询集 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

这似乎有点低效,因为它最终会为每个文件查询两次,但它实现了用户只能访问他们明确请求的文件的效果。