[DRF] ViewSet, GenericViewSet, ModelViewSet 페이지 네이션 사용 방법
1. ViewSet
from rest_framework.viewsets import ViewSet
from rest_framework.pagination import PageNumberPagination
class CustomPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100
class MyViewSet(ViewSet):
pagination_class = CustomPagination
def list(self, request):
queryset = MyModel.objects.all()
paginator = self.pagination_class()
result_page = paginator.paginate_queryset(queryset, request)
serializer = MyModelSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
- ViewSet은 기본적인 뷰 기능을 제공하는 클래스이다.
- CustomPagination 클래스는 커스텀 페이지네이션 설정을 정의한 클래스이다. page_size는 한 페이지에 보여질 객체 수, page_size_query_param은 페이지 크기를 동적으로 설정하는 쿼리 파라미터 이름, max_page_size는 최대 페이지 크기를 의미한다.
- MyViewSet은 ViewSet을 상속받은 뷰 클래스이다. pagination_class 속성을 CustomPagination 클래스로 설정하여 페이지네이션을 적용한다. list 메서드에서는 queryset을 가져오고, 페이지네이션 기능을 수행한 뒤 직렬화하여 응답한다.
2. GenericViewSet
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from rest_framework.pagination import LimitOffsetPagination
class CustomPagination(LimitOffsetPagination):
default_limit = 10
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 100
class MyViewSet(GenericViewSet, ListModelMixin):
pagination_class = CustomPagination
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
- GenericViewSet은 일반적인 CRUD 기능을 제공하는 클래스이다.
- CustomPagination 클래스는 커스텀 페이지네이션 설정을 정의한 클래스이다. default_limit는 한 페이지에 보여질 객체 수, limit_query_param은 페이지 크기를 동적으로 설정하는 쿼리 파라미터 이름, offset_query_param은 페이지 오프셋을 설정하는 쿼리 파라미터 이름, max_limit은 최대 페이지 크기를 의미한다.
- MyViewSet은 GenericViewSet과 ListModelMixin을 상속받은 뷰 클래스이다. pagination_class 속성을 CustomPagination 클래스로 설정하여 페이지네이션을 적용한다. queryset은 필터링할 모델 데이터를 가져오고, serializer_class는 해당 모델에 대한 직렬화 클래스를 설정한다.
3. ModelViewSet
from rest_framework.viewsets import ModelViewSet
from rest_framework.pagination import CursorPagination
class CustomPagination(CursorPagination):
page_size = 10
ordering = 'created_at'
class MyViewSet(ModelViewSet):
pagination_class = CustomPagination
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
- ModelViewSet은 모델에 대한 CRUD 기능을 제공하는 클래스이다.
- CustomPagination 클래스는 커스텀 페이지네이션 설정을 정의한 클래스이다. page_size는 한 페이지에 보여질 객체 수, ordering은 페이지네이션 기준 필드를 의미한다.
- MyViewSet은 ModelViewSet을 상속받은 뷰 클래스이다. pagination_class 속성을 CustomPagination 클래스로 설정하여 페이지네이션을 적용한다. queryset은 필터링할 모델 데이터를 가져오고, serializer_class는 해당 모델에 대한 직렬화 클래스를 설정한다.