使用自定义post方法和mod重写Django REST视图集

2024-06-26 00:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django的REST框架中有一个ModelViewSet,它使我能够完成一篇文章并通过以下地址:

api/v1/users

这些用户与注释表有反向关系,我希望能够通过以下URL访问这些注释:

api/v1/users/<username>/comments

我可以通过重写querysetserializer_class来设置自定义@detail_route,但它只适用于GET请求。如果我试图通过REST框架的管理部分发布一个新的注释,我会收到一个错误通知,指出“ListSerializer”对象不可iterable”

这是我的代码:

class UserViewSet(viewsets.ModelViewSet):
    queryset         = User.objects.all()
    serializer_class = UserFlat
    lookup_field     = 'username'


    @detail_route(methods=['post','get'])
    def comment(self, request, **kwargs):

        user = self.get_object()

        self.queryset         = Comment.objects.filter(recipient=user.id)
        self.serializer_class = CommentFlat

        serializer = CommentFlat(instance=self.queryset, many=True)

        return Response(serializer.data)

新注释应采用以下参数:

comment.author,comment.message,comment.recipient评论

我可以在管理面板中输入所有这些字段,并尝试创建post请求,但失败了。理想情况下,我只需要填写comment.message和comment.author,comment.recipient字段应该使用在urlapi/v1/users/<username>/comments中获得的user.id自动填充

有人知道为什么我的post请求没有完成,以及我如何自动填充这一字段吗?


Tags: self框架restapicommentusernamepostusers
1条回答
网友
1楼 · 发布于 2024-06-26 00:30:23

我想出来了。对于那些寻找答案的人来说,解决方案是显式定义在request.method == 'POST'时发生的操作,并将对象传递给序列化程序。

    @detail_route(methods=['post','get'])
    def comment(self, request, **kwargs):

        user = self.get_object()

        self.queryset = Comment.objects.filter(recipient=user.id)
        self.serializer_class = CommentFlat

        if request.method == 'POST':

            # request.data is from the POST object. We want to take these
            # values and supplement it with the user.id that's defined
            # in our URL parameter
            data = {
                'comment': request.data['comment'],
                'rating': request.data['rating'],
                'author': request.data['author'],
                'recipient': user.id
            }

            serializer = CommentFlat(data=data)

            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        # Return GET by default
        else:

            serializer = CommentFlat(instance=self.queryset, many=True)

            return Response(serializer.data)

相关问题 更多 >