如何以编程方式向DRF 3中的PrimaryKeyRelatedField提供`queryset`

syn*_*nic 10 django-rest-framework

为了具有非只读PrimaryKeyRelatedField,您需要提供包含有效选项的查询集.

如何根据当前请求(用户)正确填充该查询集?

Myk*_*lis 44

关键是使用请求上下文中的用户信息PrimaryKeyRelatedFieldget_queryset方法进行子类化和重载:

class UserFilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField):
    def get_queryset(self):
        request = self.context.get('request', None)
        queryset = super(UserFilteredPrimaryKeyRelatedField, self).get_queryset()
        if not request or not queryset:
            return None
        return queryset.filter(user=request.user)
Run Code Online (Sandbox Code Playgroud)

然后,您可以像(未过滤的)原始文件一样使用此新的序列化程序:

class MySerializer(serializers.ModelSerializer):
    related = UserFilteredPrimaryKeyRelatedField(queryset=MyModel.objects)
Run Code Online (Sandbox Code Playgroud)

每当序列化程序访问查询集时,它都将被过滤,以便只返回当前用户拥有的对象.

  • 我不知道为什么这不是公认的答案.这是唯一一个回答这个问题的人. (4认同)