首页 > 如何在一个ModelViewSet 的@detail_route 方法中使用另一个ModelViewSet 的实例?

如何在一个ModelViewSet 的@detail_route 方法中使用另一个ModelViewSet 的实例?

两个Model User 和 Post,Post 是 User 发的帖子

所以就有两个 ModelViewSet,UserViewSet 和 PostViewSet
我想使用 @detail_route 用 /users/1/posts/ 的 url 格式获取某个用户的 帖子列表
如果是简单的获取,这个实现没什么问题,现在有个问题是我想在返回列表的时候可以过滤

这是普通的 PostViewSet 中的获取列表,self 是 PostViewSet 的实例,所以没什么问题

# 这是调用自身的过滤规则
queryset = self.filter_queryset(self.get_queryset())

page = self.paginate_queryset(queryset)
if page is not None:
    serializer = self.get_serializer(page, many=True)
    return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

如果使用 /users/1/posts/ 的方式的话,self 就是 UserViewSet 了
所以我想在这个自定义的 @detail_route 中使用 PostViewSet
这样就可以直接使用 post 的过滤规则等等,就是把上面的self 可以换成 PostViewSet 的实例

class UserViewSet(viewsets.ModelViewSet):
    queryset = MyUser.objects.all()
    serializer_class = UserSerializer
    filter_class  = UserFilter

    @detail_route(methods=['get'], url_path='posts')
    def get_posts(self, request, pk=None):

        # 这样写是不对的,问题好像是出在传参这里
        post_viewset = PostViewSet(request=self.request)

        the_user = self.get_object()
        post_queryset = the_user.posts.all()
        queryset = post_viewset.filter_queryset(post_queryset)

        page = post_viewset.paginate_queryset(queryset)
        if page is not None:
            serializer = post_viewset.get_serializer(page, many=True)
            return post_viewset.get_paginated_response(serializer.data)

        serializer = post_viewset.get_serializer(queryset, many=True)
        return Response(serializer.data)

这样传参好像是不对的,提示找不到 format_kwarg,请问我该如何实现我这个需求呢?

【热门文章】
【热门文章】