티스토리 뷰
오늘은 페이징 두번째 클래스인 LimitOffsetPagination을 알아보도록 하자.
이 클래스의 특징은 PageNumberPagination과는 조금(?) 다른 인터페이스를 갖고 있는데 PageNumberPagination은 클래스 이름과 마찬가지로 페이지 숫자와 page_size 파라미터를 전달하면 페이징 처리를 간편하게 해결해줬는데 LimitOffsetPagination도 마찬가지로 Limit과 Offset 파라미터를 전달하면 페이징 처리를 해준다는 이야기다.
뭐라고 말은 하긴 했는데 무슨 소리인지 모르겠다면 내가 늘 하는 이야기.
아래의 코드를 참고해보자. board-type/view.py 파일을 지난번 버전에서 수정했다.
from django.shortcuts import render
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.filters import SearchFilter
from rest_framework.response import Response
from .serializers import BoardTypeSerializer
from .models import BoardType
# Create your views here.
class BoardListCreateView(ListCreateAPIView):
name = "board-list-create"
serializer_class = BoardTypeSerializer
"""
페이징 클래스 적용
"""
pagination_class = LimitOffsetPagination
def get_queryset(self):
queryset = BoardType.objects.all()
return queryset
def list(self, request, *args, **kwargs):
queryset = self.set_filters( self.get_queryset(), request )
"""
paginate_queryset 내장 함수에 queryset 객채를 전달한다.
"""
page = self.paginate_queryset(queryset)
"""
page 객체가 존재한다면 get_paginated_response 내장함수를 이용해 응답한다.
200 Success로 응답한다.
"""
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def set_filters(self, queryset, request):
type = request.query_params.get('type', None)
description = request.query_params.get('description', None)
if type is not None:
queryset = queryset.filter(type=type)
if description is not None:
queryset = queryset.filter(description__contains=description)
return queryset
class BoardRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView):
name = "board-retrieve-update-destroy"
serializer_class = BoardTypeSerializer
queryset = BoardType.objects.all()
위의 코드를 보면 지난번 버전에서 바뀐건 pagination_class가 LimitOffsetPagination으로 바뀐것과 paginate_queryset을 가져오는 부분에 page_size 쿼리 파라미터를 지정하는 부분이 사라졌다는 점 외에 달라진 것을 확인 할 수 없을 거다.
하지만 이렇게 단순한 설정들 만으로 LimitOffsetPagination은 적용이 완료된 거다.
PageNumberPagination과 LimitOffsetPagination의 차이점은 page_size를 받는 파라미터를 limit으로 받는다는 것과 페이지 숫자 대신 offset을 통해 게시물의 인덱스값을 받는 다는 점이다. 설정상으로는 PageNumberPagination보다는 LimitOffsetPagination이 조금 더 편하지만 실제로 페이징 처리를 하는 부분에선 PageNumberPagination이 조금 더 사용하기 편리하다.
위와 같이 코딩을 했다면 서버를 기동한 뒤에 브라우저를 통해 'localhost:8000/board-type/?limit=3&offset=0' 으로 접속해보자.
이렇게 limit은 한 페이지당 노출되는 게시물의 갯수를 의미하고 offset은 "몇 번 인덱스" 레코드 부터 보여질 것인지 결정하는 파라미터다.
그럼 여기서 퀴즈가 하나 나간다.
한번에 보여질 게시물의 갯수가 10개일때 32페이지를 보고 싶다면 offset은 어떻게 설정해야할까?
이 공식을 적용하면 되겠다. 마지막에 -1을 붙인 이유는 인덱스는 0부터 시작하는데 페이지 넘버는 1부터 시작하기 때문인건 다들 알고 있겠지?
LimitOffsetPagination의 장점과 단점을 다시 한번 정리하자면 설정하는데는 쉽지만 사용하기는 조금(?) 어려울 수도 있다는 것이 단점이라고 하겠다.
다음에는 CursorPagination에 대해서 알아보는 시간을 가져보도록 하겠다.
안녕!
'Dev > Python' 카테고리의 다른 글
Python(파이썬) 설치하기(For Windows) (0) | 2019.08.08 |
---|---|
Django API 연동하기 - 2. 검색과 페이징 #3 PageNumberPagination (0) | 2018.06.13 |
Django API 연동하기 - 2. 검색과 페이징 #2 (2) | 2018.06.06 |
Django API 연동하기 - 2. 검색과 페이징 #1 (0) | 2018.06.05 |
Django API 연동하기 - 1. 준비운동 (0) | 2018.06.01 |