

아래를 추가
from api.views import category_list, category_detail
...(생략)...
urlpatterns = [
path("categories/", category_list),#dev_54
path("categories/<int:pk>/", category_detail),#dev_54
]
아래를 추가
#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',
})

/categories/ 주소에 대해 URL Reverse 이름은 category-list이 등록
/categories/10/ 류의 주소에 대해 URL Reverse 이름은 category-detail이 등록
viewset에서는 위의 두개의 주소를 하나로 묶을수 있음
Django Rest framework Model ViewSet 상속받을 경우 기본으로 제공되는 메서드입니다.
디폴트 매핑의 경우, list route 에 대해서 2개, detail route 에 대해서 4개에 대해서 매핑을 해주게 된다.
한마디로 6개의 매핑을 한꺼번에 할수 있다.
#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
]
똑같이 아래와 같이 테스트

- @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