Router는 ViewSet에서 사용할 수 있는 기능으로, 기본적으로 제공하는 url에 view를 매핑할 수 있도록 해준다. url은 총 6개가 있다.
POST(create)
GET(list/retrieve)
PUT(update)
DELETE(destroy)
PATCH(partial_update)
DRF 공식문서의 SimpleRouter 예시다.
router = routers.SimpleRouter()
: SimpleRouter 사용router.register(r'users', UserViewSet)
: users라는 url에 UserViewSet 매핑 Router의 종류는 SimpleRouter
, DefaultRouter
두 가지가 있다. 6개의 url이 만들어진다는 것은 동일하지만, DefaultRouter에만 존재하는 url이 2개가 있다.
.json
, .api
)/?format=json
, /?format=api
)공식 문서에서 더 자세한 사항을 알 수 있다. GO
DRF에서는 View는 Views
, Generic views
, Viewsets
세 개로 나뉘어져 있다. ViewSet
에는 ViewSets, GenericViewSet, ModelViewSet, ReadOnlyModelViewSet 네 가지 class가 있다. 공부할 때는 ModelViewSet을 먼저 보라는데 이유가 뭔지 알아보자.
▲ cdrf.co
View 클래스를 상속받아서 APIView를 만든다.
APIView를 상속받아서 GenericAPIView를 만든다.
GenericAPIView
+ CreateMixin
= CreateAPIViewGenericAPIView
+ ListMixin
= ListAPIViewGenericAPIView
+ RetrieveMixin
= RetrieveAPIViewGenericAPIView
+ UpdateMixin
= UpdateAPIViewGenericAPIView
+ DestroyMixin
= DestroyAPIViewListAPIView
+ CreateAPIView
= ListCreateAPIViewRetrieveAPIView
+ UpdateAPIView
+ DestroyAPIView
= RetrieveUpdateDestroyAPIViewCRUD와 DRF View 비교
CRUD DRF View 설명 HTTP Method Create Create 생성 POST Read List 다수의 레코드 읽기 GET Read Retrieve 하나의 레코드 읽기 GET Update Update 수정 UPDATE, PATCH Delete Destroy 삭제 DELETE
GenericAPIView는 GetQuerySet이나 get object와 같은 테이블 처리 메서드가 있어서 이 메서드를 사용할거면 GenericAPIView를 상속받고, 새로 작성할거면 APIView를 상속받는다. Generic은 DB와 관련된 처리를 하는 View다.
5종류의 GenericAPIView를 모두 조합해서 만든 것이 ModelViewSet이다. ViewSet을 사용하면 개발 초기에 테이블 내용을 간단히 확인해보기 좋다. 하지만 세부적인 커스텀을 하고싶다면 개별 View를 사용하는게 좋다.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
이처럼 아주 짧은 코드로도 user 테이블에 대한 CRUD 기능이 모두 동작하는 이유는 CRUD기능이 포함된 view를 모두 조합해서 만든 ModelViewSet을 상속받았기 때문임을 알 수 있다. 그래서 DRF View를 공부할 때에는 5개의 Generic API view를 먼저 숙지 해두면 ModelViewSet는 자연스레 알게된다고 한다.