Python/DRF

[DRF] DRF Pagination (by. CursorPagination)

yubi5050 2022. 11. 10. 04:37

Django에서 게시판을 만드는 방법은 크게 아래 두가지 방향으로 구현이 가능하다. 

  • Django의 Paginator (django.core.paginator import Paginator)
  • DRF(Django Rest Framework)의 Pagination(rest_frameowork.pagination)

 

두 방식은 각기 장단점이 있으며, 서비스(기능) 중심으로 더 결이 잘 맞는 적절한 방향을 정하는 것이 좋다. 

 

추가적으로 DRF 에는 세부적으로 3가지 방법이 제공되는데

  • PageNumberPagination : 페이지 크기(PAGE_SIZE)를 정하고, 페이지 번호를 요청하는 조회 방법
  • LimitOffsetPagination : 특정 지점(offset) 부터 특정 데이터 갯수(limit)을 정해서 가져오는 방법
  • CursorPagination : 요청한 데이터 기준 이전, 이후 요청시 사용

 

해당 글은 DRF의 CursorPagination 방식을 이용해 Pagination을 구현하는 방법을 설명한다.

 

1. Project, App 생성

django-admin startproject pagination4
django-admin startapp posts

 

2. settings.py

INSTALLED_APPS = [
    ....,
    'posts',
    'rest_framework',
]

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS' : 'rest_framework.pagination.CursorPagination',
    'PAGE_SIZE' : 2,
}

 

3. models.py 

from django.db import models

# Create your models here.
class Post(models.Model):
    class Meta:
        db_table = "article"
    title = models.CharField(max_length=256)
    content = models.CharField(max_length=256)

 

4-1. pagination4 / urls.py

# pagination2/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', include('posts.urls')), 
]

 

4-2. posts / urls.py

# posts/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('page/', views.PostPagination4ViewSet.as_view({'get': 'list'})),
]

 

5. serializers.py

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"

 

6. views.py

from rest_framework import viewsets
from rest_framework.pagination import CursorPagination # Cursor 기반 (next, prev 버튼) Pagination

from .models import Post
from .serializers import PostSerializer

class Pagination4(CursorPagination): # settings.py의 CursorPagination 상속
    page_size = 3 # Default 2 => 3으로 
    ordering = 'title' # 정렬 기준도 가능

# url : posts/page?limit=4&offset=2
class PostPagination4ViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    pagination_class = Pagination4 #

 

7. admins.py 

from django.contrib import admin
from posts.models import Post

admin.site.register(Post)

 

8. 명령어 실행

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
$ python manage.py runserver

 

 

9. Post 데이터 생성

admin 페이지에 접속하여 post 데이터 생성 (7개 이상 생성 권장)

 

API Test (Postman)

API Request

http://127.0.0.1:8000/posts/page/?cursor
http://127.0.0.1:8000/posts/page/?cursor=cD1mZmY%3D

 

JSON Response

{
    "next": "http://127.0.0.1:8000/posts/page/?cursor=cD1qamo%3D",
    "previous": "http://127.0.0.1:8000/posts/page/?cursor=cj0xJnA9Z2dn",
    "results": [
        {
            "id": 5,
            "title": "ggg",
            "content": "ggg"
        },
        {
            "id": 6,
            "title": "hhh",
            "content": "hhh"
        },
        {
            "id": 8,
            "title": "jjj",
            "content": "jjj"
        }
    ]
}
 

참고 문헌

https://americanopeople.tistory.com/355 // Cursor Pagination - 대용량 데이터에 페이지네이션 적용하기