인프런 커뮤니티 질문&답변

개감님의 프로필 이미지
개감

작성한 질문수

Django REST Framework 핵심사항

View 오버라이딩

like 기능을 위한 overriding 문의

작성

·

262

·

수정됨

0

안녕하세요 강사님!
강의 재미있게 보면서 공부하고 있습니다.

PostLikeAPIView에 대한 overriding 관련 문의드립니다.

class PostLikeAPIView(UpdateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostLikeSerializer

	# PATCH method
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        # data = instance.like + 1
        data = {'like': 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'])

강의 내용 중에 위 괕이 오버라이딩 하는 로직이 있었는데요.

 

# views.py
class PostLikeAPIView(UpdateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostLikeSerializer

    def patch(self, request, *args, **kwargs):
        instance = self.get_object()
        request.data['like'] = instance.like + 1
        super().patch(request, *args, **kwargs)
        return Response(request.data['like'])


# serializers.py
class PostLikeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['like']


이런 식으로 해도 같은 결과를 얻을 수 있을 수 있었습니다.

이렇게한 의도는 update method를 overriding 하는 거보다
patch method를 overriding 할 때 비즈니스 로직 코드가 더 짧으니
실수가 적지 않을까 해서 입니다.

제가 적은대로 사용하는 것도 유효한지, 어떤 단점이 있을지 잘 생각이 안나서 문의드립니다.

강의 감사하게 보고있습니다.
항상 건강하시길 바라겠습니다^^

답변 1

1

김석훈님의 프로필 이미지
김석훈
지식공유자

안녕하세요. 독자님.

코드를 간결하고 실수가 적게하는 방법을 찾는 것은 좋은 시도이고, 충분히 고려해볼만한 질문이네요.

그런데 super() 메소드를 호출하고 그 결과를 활용 못하는 단점이 있군요. super().patch(~)의 리턴값이 있으므로 이를 활용하는게 더 좋은 코드라고 생각합니다. (아래 2번 예시)

(1) super().patch(request, *args, **kwargs)
(2) result = super().patch(request, *args, **kwargs)

그리고 (1)번도 역시 결국은 update() 메소드를 호출하고 거기서 Response() 객체를 만들고 있으므로, 독자님의 코드는 Response() 객체를 중복으로 만들고 있습니다.

그래서 저는 update() 메소드를 오버라이딩하는 것을 추천하고 싶네요.

도움이 되었는지요?

개감님의 프로필 이미지
개감
질문자

친절한 답변 감사드립니다.
여러모로 고민이 되는 부분이였는데 명쾌하게 정리해주셔서 도움이 크게 되었습니다

 

개감님의 프로필 이미지
개감

작성한 질문수

질문하기