如何按当前用户过滤Tag对象查询集?Serializer无法实现求View层方案
问题:如何在ViewSet中过滤Serializer关联字段的QuerySet?
我需要按当前登录用户过滤TagPrivate,但在Serializer类里无法通过request执行queryset=TagPrivate.objects.filter(user=self.request.user)操作,相关代码如下:
Serializers代码
# serializers.py class DotPrivateSerializer(serializers.ModelSerializer): tag = serializers.PrimaryKeyRelatedField( many=False, queryset=TagPrivate.objects.all() # 需要按当前用户过滤这里的queryset ) class Meta: model = DotPrivate fields = ('id', 'name', 'description', 'lat', 'lon', 'rating', 'link', 'tag') read_only_fields = ('id',)
当前Views代码
class DotPrivateViewSet(viewsets.ModelViewSet): serializer_class = serializers.DotPrivateSerializer queryset = DotPrivate.objects.all() authentication_classes = (JWTAuthentication,) permission_classes = (IsAuthenticated,) def get_queryset(self): """只返回当前登录用户的DotPrivate对象""" return self.queryset.filter(user=self.request.user)
请问是否可以在views.py中实现该过滤逻辑?
解决方案
完全可以在ViewSet中实现这个过滤逻辑,核心是动态修改Serializer关联字段的queryset,具体实现如下:
修改你的DotPrivateViewSet,新增get_serializer()方法,在里面为tag字段设置过滤后的queryset:
class DotPrivateViewSet(viewsets.ModelViewSet): serializer_class = serializers.DotPrivateSerializer queryset = DotPrivate.objects.all() authentication_classes = (JWTAuthentication,) permission_classes = (IsAuthenticated,) def get_queryset(self): """只返回当前登录用户的DotPrivate对象""" return self.queryset.filter(user=self.request.user) def get_serializer(self, *args, **kwargs): serializer = super().get_serializer(*args, **kwargs) # 动态过滤tag字段的可选范围,仅显示当前用户的TagPrivate serializer.fields['tag'].queryset = TagPrivate.objects.filter(user=self.request.user) return serializer
逻辑说明
get_serializer()是ViewSet中负责创建Serializer实例的方法,在这里可以直接获取到当前请求的self.request.user- 这种方式不需要修改原Serializer的结构,仅在View层动态调整字段的可选范围
- 结合你已有的
get_queryset()方法,既保证了DotPrivate数据属于当前用户,也限制了关联的tag只能选择该用户自己创建的标签
内容的提问来源于stack exchange,提问作者kubaSpolsky
相关产品推荐
相关产品推荐

