Programming/Django

[DRF] 귀찮은건 싫어! ViewSet 사용해보기

stein 2021. 11. 21. 11:56

지금까지는

필자는 처음 백엔드를 구현할 때, nodejs + express + MariaDB(MySQL)로 시작했었다.

그걸 하면서 느낀건...

 

귀찮다. 너무.

 

진짜 너무 단순한 로직들인데 그걸 일일이 post, get, patch 나누어서 검증하고, 반복되는 코드를 적는게 정말이지 싫었다.

그런데 django의 존재를 알게 되었고, 귀찮은 작업을 하지 않고 필요한 로직과 모델만 짜면 api가 생긴다고 생각해서 환상을 가지고 왔으나, 그냥 똑같았다. 모델을 만들어서 db를 파이썬으로 작업한다는것 정도 말고는 이게 정말 더 좋은가... 생각했지만, 그건 DRF를 잘 몰라서 그랬던 것이었다.

 

 

[Django] APIView, Mixins, generics APIView, ViewSet을 알아보자

django 에서는 view 를 통해서 HTTP 요청을 처리합니다. view에서 이를 처리하는 방법은 다양합니다. FBV(함수기반뷰), CBV(클래스기반뷰) 를 통해서도 API 를 만들 수 있지만 rest_framework 는 보다 쉽게, 효

ssungkang.tistory.com

 

하지만 이는 APIView만 주구장창 사용했기에, 무지에서 온 불평이었다.

역시나 귀찮다고 생각된 작업들은 대부분 추상화 되어있었고, 그 중의 최고 레벨이 ViewSet이었다.

 

그래서 어떻게 쓰나요

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer   

post_list = PostViewSet.as_view({
    'get': 'list',
    'post': 'create',
})

post_detail = PostViewSet.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy',
})

urlpatterns = [
    path('post/', views.post_list),
    path('post/<int:pk>/', views.post_detail),
]

위와 같이 적어줄 수 있지만, router까지 사용한다면

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

router = DefaultRouter()
router.register(r'post',views.PostViewSet)

urlpatterns = [
    path('',include(router.urls)),
]

끝이다.

이렇게 간단한걸 나두고 일일이 작업했나 생각이 든다.

위와 같이 설정하면 url은 다음과 같아진다.

위의 lookup은 pk로 보면 되고(수정이 가능한지는 모르겠다) 각 action들은 아래와 같이 수정이 가능하다. 

class CategoryViewSet(viewsets.ModelViewSet):
    queryset = models.Category.objects.all()
    serializer_class = serializers.CategorySerializer

    def create(self, request):
        ... 원하는 로직 추가
        return Response({'id': new_category.id, 'name': new_category.name, 'type': new_category.type})

 

이제 귀찮은 작업에 안녕을 보내자~!