Reputation: 68
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
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)
url(r'^like/(?P<pk>.+)/$',LikeDetailAPIView.as_view(), name='likeapi'),
What I am intending to do is return a success message.
class LikeListSerializer(serializers.ModelSerializer):
class Meta:
model = Like
fields = [
'user',
'post',
'time',
]
Any links that I can refer to?
Upvotes: 0
Views: 681
Reputation: 88529
From the official DRF doc,
get_queryset(self)
method returns thequeryset
that should be used for list views, and that should be used as the base for lookups indetail views
. Defaults to returning the queryset specified by thequeryset
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