Django:RetrieveAPIView中的HttpResponse提供AttributeError

时间:2018-07-26 12:01:06

标签: django rest django-rest-framework httpresponse

我正在尝试创建喜欢帖子的API。这适用于喜欢帖子 但是在添加return HttpResponse/Response语句时出现错误:

AttributeError at /api/posts/like/4/
'HttpResponse' object has no attribute 'model'
Request Method: GET
Request URL: http://127.0.0.1:8000/api/posts/like/4/
Django Version: 2.0.7

views.py

class LikeDetailAPIView(RetrieveAPIView):
    serializer_class = PostSerializer

    def get_queryset(self):
        user = self.request.user
        post_id = self.kwargs['pk']
        like = Like(post=Post.objects.get(id=post_id), user=user)
        user_like = Like.objects.filter(post=post_id, user=user)

        if user_like.exists():
            user_like.delete()
            content = {'message': 'unliked'}
            return Response(content, status=status.HTTP_202_ACCEPTED)
         else:
            like.save()
            content = {'message': 'like'}
            return Response(content, status=status.HTTP_202_ACCEPTED)

urls.py

url(r'^like/(?P<pk>.+)/$',LikeDetailAPIView.as_view(), name='likeapi'),

我打算做的是返回一条成功消息。

serializer.py

class LikeListSerializer(serializers.ModelSerializer):
    class Meta:
       model = Like
       fields = [
            'user',
            'post',
            'time',
       ]

我可以参考任何链接吗?

1 个答案:

答案 0 :(得分:1)

来自官方DRF doc

  

get_queryset(self) 方法返回应用于列表视图的queryset,并且   应该用作 detail views 中查找的基础。默认值   返回由queryset属性指定的查询集。

根据您的评论,我了解到,访问API(详细视图)时需要显示一些响应。

由于您使用的是 RetrieveAPIView 类,因此必须覆盖 retrieve() 方法,如

from rest_framework.generics import RetrieveAPIView


class LikeDetailAPIView(RetrieveAPIView):
    serializer_class = PostSerializer

    def get_queryset(self):
        return Like.objects.filter(post=self.kwargs['pk'], user=self.request.user)

    def retrieve(self, request, *args, **kwargs):
        if self.get_queryset().exists():
            self.get_queryset().delete()
            content = {'message': 'unliked'}
            return Response(content, status=status.HTTP_202_ACCEPTED)
        like = Like(post=Post.objects.get(id=post_id), user=user)
        like.save()
        content = {'message': 'like'}
        return Response(content, status=status.HTTP_202_ACCEPTED)


现在,您可以通过 HTTP GET 方法

访问端点 /api/posts/like/4/