如何以编程方式向 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)
每当序列化程序访问查询集时,都会对其进行过滤,以便只返回当前用户拥有的对象。
为了拥有非只读 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)
每当序列化程序访问查询集时,都会对其进行过滤,以便只返回当前用户拥有的对象。