본문으로 바로가기

DRF class-based-views (https://www.django-rest-framework.org/api-guide/views/#class-based-views)

Generic-views (https://www.django-rest-framework.org/api-guide/generic-views/)

 

🚀 class based view

 

DRF의 설명을 보면 크게 views를 class based view와 function based view로 나뉩니다. django와 똑같습니다.

종래의 decorator를 활용한 function based view는 다음과 같습니다.

from rest_framework.decorators import api_view
from rest_framework.response import Response
from . import models as rooms_models
from .serializers import RoomSerializer


@api_view(["GET"])
def list_rooms(request):

    rooms = rooms_models.Room.objects.all()
    serialized_rooms = RoomSerializer(rooms, many=True)

    return Response(data=serialized_rooms.data)

 

이를 class based view로 바꿔보겠습니다.

get 명령을 받으려먼 다음과 같이 get 함수를 만들면 됩니다. post는 def post(...) 로 해주면 되겠죠

 

from rest_framework.views import APIView
from rest_framework.response import Response
from . import models as rooms_models
from .serializers import RoomSerializer


class ListRoomsView(APIView):
    def get(self, request):
        rooms = rooms_models.Room.objects.all()
        serializer = RoomSerializer(rooms, many=True)

        return Response(data=serializer.data)

urls.py 부분도 바꿔줍시다. class 뷰니까 as_view() 메서드를 사용해줘야 합니다.

urlpatterns = [
    path("list", views.ListRoomsView.as_view()),
]

 

 

🚀 Generic view

 

한편, django에서 class based view를 쓸 때와 마찬가지로 Generic view를 상속받아 사용할 수도 있습니다.

 

generic view를 쓰다보면 알겠지만 대개 queryset (무슨 데이터를 쓸거야)와 serializer_class필수값입니다.

까먹어도 어차피 django에서 필수도 넣으라고 오류 메세지를 보내주니 알아만 둡시다.

 

일반 django에서는 generic을 확인하기 위해 여기를 확인했습니다. (https://ccbv.co.uk/)

DRF에서는 generic을 확인하기 위해 다음 사이트를 활용합니다. (http://www.cdrf.co/)

 

 

ListAPIView를 사용해보았습니다. ListAPIView는 mixins.ListModelMixin, GenericAPIView를 합쳐 만든 것입니다. (generic.py를 열어보면 다 나와있습니다)

from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from . import models as rooms_models
from .serializers import RoomSerializer


class ListRoomsView(ListAPIView):

    queryset = rooms_models.Room.objects.all()
    serializer_class = RoomSerializer

 

 

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체