GET 메서드
PATCH 메서드
좋아요 기능
은 사용자로부터 입력받는 값이 없기 때문에, bytes → dict → is_valid()
까지의 역직렬화 과정이 불필요함!좋아요 기능
은 굳이 PATCH 메서드로 처리하지 않고 GET 메서드로 처리도 가능함!PATCH 메서드로 구현된 좋아요 기능(views.py)
class PostLikeAPIView(UpdateAPIView):
queryset = Post.objects.all()
serializer_class = PostLikeSerializer
# PATCH method
# update 메서드 오버라이딩
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
# 내부에 like + 1 로직 추가 (이후 serializer의 data변수에 dict 형태로 넣어줌)
data = {'like' : instance.like + 1}
# data = instance.like + 1
serializer = self.get_serializer(instance, data=data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
# return Response(serializer.data)
return Response(data['like'])
GET 메서드로 구현된 좋아요 기능(views.py) → serializer 클래스 사용 X
class PostLikeAPIView(GenericAPIView):
queryset = Post.objects.all()
# serializer_class = PostLikeSerializer
# GET method (역직렬화 과정 불필요)**
def get(self, request, *args, **kwargs):
instance = self.get_object()
instance.like += 1
instance.save()
return Response(instance.like)
instance = self.get_object()
: DB로부터 instance를 가져옴
instance.like += 1
: like 속성을 1 증가시킴
instance.save()
: 변경된 instance를 DB에 저장
return Response(instance.like)
: 새로운 like 값(instance.like)을 client에게 보내줌
serializer 클래스는 사용하지 않아서 주석처리 해주었는데, queryset
은 여전히 필요한지 확인해보기!⭐
get_object()
+ ctrl
+ click
→ GenericAPIView 클래스에 정의
get_queryset()
+ ctrl
+ click
→ GenericAPIView 클래스에 정의
assert ~
)이 두 메서드(get_object()
와 get_queryset()
)은 GenericAPIView
클래스에 정의되어 있음!
코드에서 get_object()
나 get_queryset()
메서드를 사용하려면 APIView가 아니라 GenericAPIView
를 상속받아야 함!⭐
동일한 기능을 APIView
를 상속받아 구현할 수도 있지만 '재사용성' 측면에서 권장하지는 않음
# GenericAPIView대신 APIView를 상속받아 사용
class PostLikeAPIView(APIView):
# queryset = Post.objects.all()
# serializer_class = PostLikeSerializer
# GET method (역직렬화 과정 불필요)**
def get(self, request, *args, **kwargs):
# instance = self.get_object(~)
instance = get_object_or_404()
instance.like += 1
instance.save()
return Response(instance.like)
APIView
를 상속받아 사용하면, 'queryset'이나 'get_object()' 메서드를 사용하지 않고 get_object_or_404(~)
로 DB에서 instance를 가져오는 코드를 직접 작성해야 함!https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-drf/dashboard