64.Django(장고) - ecommerce 프로젝트 - DRF - ViewSet을 이용한 예제(CRUD) 및 커스텀 마이징

JungSik Heo·2024년 12월 19일

1. api\urls.py

아래를 추가

from api.views import category_list, category_detail
...(생략)...
urlpatterns = [
 path("categories/", category_list),#dev_54
 path("categories/<int:pk>/", category_detail),#dev_54
 ]

2. api\views.py

아래를 추가

#dev_54
# List Route
class CategoryViewSet(ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer


# REST API 규격에 맞춘 URL 매핑

# List Route
category_list = CategoryViewSet.as_view({
    'get': 'list',
    'post': 'create',
})

# Detail Route
category_detail = CategoryViewSet.as_view({
    'get': 'retrieve',
    'put': 'update',
    'patch': 'partial_update',
    'delete': 'destroy',
})

아래와 같이 CRUD 테스트

3.router 활용하기

/categories/ 주소에 대해 URL Reverse 이름은 category-list이 등록
/categories/10/ 류의 주소에 대해 URL Reverse 이름은 category-detail이 등록
viewset에서는 위의 두개의 주소를 하나로 묶을수 있음

Django Rest framework Model ViewSet 상속받을 경우 기본으로 제공되는 메서드입니다.

  • create - POST /
  • list - GET /
  • retrieve - GET /
  • update - PUT /
  • partial_update - PATCH /
  • destroy - DELETE /

디폴트 매핑의 경우, list route 에 대해서 2개, detail route 에 대해서 4개에 대해서 매핑을 해주게 된다.

한마디로 6개의 매핑을 한꺼번에 할수 있다.

api\urls.py

#dev_54
router = DefaultRouter()
router.register(r'categories',CategoryViewSet)

urlpatterns = [
...(생략)...
#path("categories/", category_list),#dev_54
#path("categories/<int:pk>/", category_detail),#dev_54
path("", include(router.urls)),#dev_54
    ]

똑같이 아래와 같이 테스트

4.@action 을 활용한 커스텀 마이징

  • @action 태그를 활용 하여 아래와 같이 커스텀 마이징이 가능하다.
  • @action: 특정 HTTP 메소드와 URL 경로를 가진 뷰셋에 사용자 정의 작업을 추가합니다.
  • Django REST Framework (DRF)에서 @action 데코레이터는 뷰셋(viewset)에서 사용되며, 기본 CRUD(Create, Retrieve, Update, Delete) 작업으로 제공되지 않는 사용자 정의 작업 또는 추가적인 엔드포인트를 정의하는 데 사용됩니다.

예제
api\views.py

  
    #dev_56
    #https://wikidocs.net/197563
    # url : categories/order_name/
    @action(detail=False, methods=['GET'])
    def order_name(self, request):
        qs = Category.objects.all().order_by('-name')
        serializer = self.get_serializer(qs, many=True)
        return Response(serializer.data)

아래를 추가하고 postman 으로 테스트 해보자

 
    #url : categories/{pk}/set_name/
    @action(detail=True, methods=['patch'])
    def set_name(self, request, pk):
        instance = self.get_object()
        print(request.data.get('name'))
        instance.name = request.data.get('name')
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data) 

  

id 5번이 루비로 수정 되었는지 확인

https://seoyoung2.github.io/django/2020/08/10/ViewSet-Router.html

profile
쿵스보이(얼짱뮤지션)

0개의 댓글