[drf]airbnb api - 6 ModelViewSet

Hyeseong·2021년 3월 24일
0
post-thumbnail

앞 시간에는 APIView를 사용했는데요. 이번에는 ModelViewSet을 한 번 경험해 보겠습니다.
즉, viewset&router기능을 한번 사용해 볼게요.

앞서서 우리는 Serializer 클래스 -> ModelSerializer > APIView -> ListAPIView,RetrieveAPIView
사용하여 정말 압축하여 로직을 작성했는데요. 이보다 한층 더 간결한 방식을 알아볼게요.

viewsets

viewsets패키지를 이용해보쥬

ModelViewSet

기존에 작성했었던 ListRoomsView, SeeRoomView를 합한 기능을 가지고 있어요.

rooms/viewsets.py

from rest_framework import viewsets
from .models import Room
from .serializers import BigRoomSerializer


class RoomViewset(viewsets.ModelViewSet):

    queryset = Room.objects.all()
    serializer_class = BigRoomSerializer

router

url역시 작성할 필요가 없게 만들어 주기도 합니다.

rooms/urls.py

from rest_framework import viewsets
from .models import Room
from .serializers import BigRoomSerializer

from rest_framework.routers import DefaultRouter
from django.urls import path
from . import viewsets

app_name = "rooms"

router = DefaultRouter()
router.register("", viewsets.RoomViewset, basename="room")

urlpatterns = router.urls




사실상 작성한 소스코드 몇줄 되지 않았는데 collection, item을 보여주고 페이지 네이션도 지정되어있습니다. 심지어 GET,POST,PUT<DELETE 요청도 제공합니다.

하지만 지금 상태로는 무엇인가를 그냥 만들수 있고 어떤것이든지 읽을수 있기에 실제 사용에는 한계가 있겠조? 즉, 너무 공개된 접근성을 띄고 있기 때문이에요.

예를들어, 네가지 케이스의 경우 아래 2가지 경우인 NO가 성립할 수 있게 변경해줘야해요.

  • 누구나 방 리스트를 보는건 ㅇㅋ
  • 단일 방의 정보를 보는건 ㅇㅋ
  • 그러나 방 정보를 변경하는건 노!
  • 어느 누구나 방 정보를 삭제하는 건 노!

ViewSet

앞서서 모델뷰셋을 상속받아서 비즈니스 로직을 짜봤는데요. 그것 보단 더 오버라이딩이 필요한 뷰셋이 있어요.

기존 HTTP Method 동사이름으로 짜던것과는 차이가 보이조?

list(GET), retrieve(GET), update(PUT), partial_update(PATCH), destroy(DELETE) 이렇게 대응됩니다.

결국에는 ViewSet을 통해서 본인이 구현하려는 API를 더 효율적으로 짤거에요.

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글