inflearn logo
강의

Course

Instructor

Django REST Framework Essentials

View Overriding

like 기능을 위한 overriding 문의

322

boomboom

9 asked

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 할 때 비즈니스 로직 코드가 더 짧으니
실수가 적지 않을까 해서 입니다.

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

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

django rest-api

Answer 1

1

bestdjango

안녕하세요. 독자님.

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

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

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

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

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

도움이 되었는지요?

0

boomboom

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

 

블로그 첫 화면이 안 나옵니다.

0

317

3

INSTALLED_APPS 순서

0

246

1

vscode 실행안됨

0

667

3

django venv activate 하고 나서 vue 서버도 실행 해야 하나요?

0

367

2

더 공부할게있을까요

0

369

1

용어에 대해 문의 드립니다.

0

283

2

코드 최적화 과정

0

364

1

유저 1명이 1개의 게시글에 좋아요를 누를 경우

0

356

1

프로잭트를 생성하고 runserver하면 ModuleNotFoundError: No module named 발생해요

0

894

4

GET Method 에서 왜 Like 수를 증가시키는지 궁금합니다.

0

376

1

CSRF Token에 대한 질문입니다.

0

609

1

ModuleNotFoundError: No module named 'rest_framework django' 오류

0

3037

1

앱을 구성할 때 api 앱과 blog 앱을 나누어서 구성하는 이유가 궁금합니다ㅜ

1

472

2

to_representation() 오버라이딩 질문입니다.

0

496

3

공부 순서에 관해 질문드립니다.

0

360

1

CateTagAPIView에서 get 메소드

1

309

2

깃헙 페이지를 보고싶어요

0

230

1

디버거 관련 질문입니다.

0

277

3

가장 마지막강의 (Generic View -> ViewSet migration) 질문입니다.

0

223

1

PostCommentListAPIView(게시물 댓글 조회 api) 관련 질문

0

211

1

댓글 보기 및 삭제 api

0

280

1

post, comment crud 질문

0

228

4

CateTagSerializer 질문입니다!

3

336

3

The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.

0

840

1