首页 > 解决方案 > 在 DRF 中的帖子上更新点赞

问题描述

我正在尝试在 django (DRF) 中编写一个视图,该视图允许用户在帖子上添加点赞,更新帖子上的点赞状态(喜欢/不喜欢)并删除帖子上的点赞。帖子 ID 在参数中发送,用户 ID 从身份验证令牌中提取。

我想出了如何做前两个,但我不知道如何做更新。到目前为止,这是我的观点:

class LikeView(generics.CreateAPIView, UpdateModelMixin, DestroyModelMixin):
    serializer_class = LikeSerializer
    queryset = Like.objects.all()
    lookup_field = 'post'
    permission_classes = [IsAuthenticated]

    def get_object(self):
        post = self.request.query_params.get('post')
        user = self.request.user.id
        return self.get_queryset().filter(post=post, user=user)

    # retrieve user ID from token, validate data and save the like on post (working)
    def post(self, request, *args, **kwargs):
        data = self.get_data(request)
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response('Like has been saved')

    def put(self, request, *args, **kwargs):
        data = self.get_data(request)
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

    # working
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

    # add the data from param and token to a copy of the request body 
    # to use with the serializers
    def get_data(self, request):
        data = request.data.copy()
        data['post'] = self.request.query_params.get('post')
        data['user'] = request.user.id
        return data

喜欢的型号:

class Like(models.Model):
    user = ForeignKey(User, on_delete=models.CASCADE)
    post = ForeignKey(Post, on_delete=models.CASCADE)
    state = BooleanField(
        default=True, help_text='Like = True, Dislike = False')
    created_at = DateTimeField(auto_now_add=True)
    updated_at = DateTimeField(auto_now=True)

    def __str__(self):
        state_int = int(self.state)
        return ['Dislike', 'Like'][state_int]

    class Meta:
        unique_together = ('user', 'post')

我在这里做错了什么?缺少什么put处理程序?

标签: pythondjangodjango-rest-framework

解决方案


You have missed providing instance parameter to the serializer in the put method.

class LikeView(generics.CreateAPIView, UpdateModelMixin, DestroyModelMixin):
    # other code

    def put(self, request, *args, **kwargs):
        data = self.get_data(request)
        like_instance = Like.objects.get(user=request.user, post_id=int(data['post']))  # you should include 'post' while making PUT requests
        serializer = self.get_serializer(instance=like_instance, data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response('Your response')

推荐阅读