【发布时间】:2015-01-14 15:56:58
【问题描述】:
为了拥有非只读的PrimaryKeyRelatedField,您需要提供一个包含有效选项的查询集。
如何根据当前请求(用户)正确填充该查询集?
【问题讨论】:
为了拥有非只读的PrimaryKeyRelatedField,您需要提供一个包含有效选项的查询集。
如何根据当前请求(用户)正确填充该查询集?
【问题讨论】:
关键是继承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)
每当序列化程序访问查询集时,都会对其进行过滤,以便仅返回当前用户拥有的对象。
【讨论】:
or not request.user.is_authenticated,因此当没有用户登录时它返回 None 而不是异常
视图有一个
self.request.user
属性,然后您可以使用它来获取与用户相关的查询集 例如
queryset = Products.objects.get(customer=self.request.user)
【讨论】: