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

How to programmatically provide `queryset` to PrimaryKeyRelatedField in DRF 3

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

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

视图有一个

self.request.user

您可以使用该属性来获取与用户相关的查询集 例如

queryset = Products.objects.get(customer=self.request.user)

关键是继承 PrimaryKeyRelatedField 并重载 get_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)

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

class MySerializer(serializers.ModelSerializer):
    related = UserFilteredPrimaryKeyRelatedField(queryset=MyModel.objects)

每当序列化程序访问查询集时,都会对其进行过滤,以便只返回当前用户拥有的对象。