당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF-Tutorial-33편- ViewSets를 사용하기 위해 코드 다시 짜기

Refactoring to use ViewSets


현재 views 를 viewsets 를 사용하기 위해서, 코드를 다시 refactor 해봅시다.


우선, 우리의 UserList 와 UserDetail 뷰들을 하나의 UserViewSet 으로 리펙터 해줍니다. 우리는 이 두개의 뷰들을 삭제하고, 하나의 클래스로 대체할수 있습니다.


1
2
3
4
5
6
7
8
from rest_framework import viewsets 

class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides 'list' and 'detail' actions
"""
queryset = User.objects.all()
serailizer_class = UserSerializer

우리는 여기에 ReadOnlyModelViewSet 클래스를 사용하여, 자동으로 기본동작인 read-only 를 주었습니다.


우리는 여전히 queryset 과 serializer_class 속성들을 우리가 일반 뷰들을 사용할때처럼 정확하게 명시해 주었습니다. 하지만, 우리는 더이상 같은 정보를 두개의 별도 클래스들에 주지 않아도 됩니다.


SnippetList, SnippetDetail, SnippetHighlight


다음은, 우리는 SnippetList, SnippetDetail 그리고 SnippetHighlight 뷰 클래스들을 교체 해줄겁니다. 우리는 이 세개의 뷰들을 삭제하고, 하나의 클래스로 대체해줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from rest_framework.decorators import action 
from rest_framework.response import Response


class SnippetViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides 'list', 'create', 'retrieve', 'update' and 'destroy' actions

Additionally, we also provide an extra 'hihghlight' action.
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticateOrReadOnly, IsOwnerOrReadOnly]
@action(detail=True, rendere_classes[renderers.StaticHTMLRenderer])
def highlight(self, request, *args, **kwargs):
snippet = self.get_objects()
return Response(snippet.highlighted)

def perform_create(self, serializer):
serializer.save(owner=self.request.user)

이번에 우리는 ModelViewSet 클래스를 사용해서, 완벽하게 기본 읽기와 작성 동작들을 설정해주었습니다.


또한 @action 데코레이터를 사용하여, highlight 라는 커스텀 엑션을 생성해 주었다는것도 숙지해야 합니다. 이 데코레이터는 create/update/delete 스타일에 맞지 않는 커스텀 앤드포인트들을 추가할때 사용됩니다.


@action 데코레이터를 사용하는 커스텀 엑션들은 기본적으로 GET 요청들에 반응합니다.


만일 우리가 POST 요청에 반응하는 엑션을 원한다면, 우리는 methods 인자를 사용할수 있습니다.


커스텀 엑션의 URL 들은 기본적으로, 해당 메서드 이름에 따라 결정됩니다. 만약, 우리가 URL 이 생성되는 방식을 바꾸고 싶으면, url_path 를 데코레이터의 키워드 인자로 포함할수 있습니다.