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

发布于 2022-09-01 16:22:37 字数 1683 浏览 18 评论 0

两个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,请问我该如何实现我这个需求呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文