Gokul
Gokul

Reputation: 68

Django: HttpResponse in RetrieveAPIView giving an AttributeError

I'm trying to create API for liking a post. This works for liking a post but I get error when adding the return HttpResponse/Response statements gives an error:

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'),

What I am intending to do is return a success message.

serializer.py

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

Any links that I can refer to?

Upvotes: 0

Views: 681

Answers (1)

JPG
JPG

Reputation: 88529

From the official DRF doc,

get_queryset(self) method returns the queryset that should be used for list views, and that should be used as the base for lookups in detail views. Defaults to returning the queryset specified by the queryset attribute.

From your comments, I understood that, you need to show some response when you access the API (detail-view).

Since you are using RetrieveAPIView class, you have to override retrieve() method, as

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)


Now you can access the endpoint, /api/posts/like/4/ by HTTP GET method

Upvotes: 1

Related Questions