반응형

API 서버에서 Pagination 

-> 사용자가 게시판의 전체 글 목록 요청 시 /
    수 많은 데이터들을 한번에 전달 한다면 데이터를 받는 사용자는 많은 데이터를 감당할 수 없을 것 

 

API 서버에서 Pagination을 사용하는 이유

- > 하나의 Request 만으로 처리하기 어려운 레코드들을 여러 Request로 나누어 전송하기 위해 사용

 

DRF에서의 Pagination

  1. PageNumberPagination 
  2. LimitOffsetPagination 
  3. CursorPagination
  4. CustomizedPagination

1, 2, 3 = Django restFramework 에서 제공하는 Pagination class

4 = 직접 Pagination class를 직접 커스터마이징 해서 사용하는 방법 

 

흔히, PageNumberPagination 을 Default로 설정하고

추가적인 페이지 설정 부분만 CustomizedPagination 을 사용

 

 

프로젝트 기본 세팅

1. Django Project 생성

2. 경로 이동 및 앱 생성

3. settings.py에 앱 등록

4. models.py 작성 및 admin.py 연결

5. makemigrations 및 migrate 진행

6. serializer.py 생성 및 작성

from .models import Post
from rest_framework import serializers


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

 

7. views.py 작성

from .models import Post
from .serializer import PostSerializer
from rest_framework import viewsets


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

 

 

8. urls.py 작성

- 앱 내부의 urls.py

from rest_framework.routers import DefaultRouter
from django.urls import include, path
from .views import PostViewSet

router = DefaultRouter()
router.register('post', PostViewSet)

urlpatterns = [
    path('', include(router.urls))
]

 

- 프로젝트 폴더의 urls.py 

from django.contrib import admin
from django.urls import path, include
import post.urls

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

 

DRF로 Pagination 구현하기

DEFAULT_PAGINATION_CLASS는 None이며 PAGE_SIZE 또한 NONE이다.

 

settings.py에 Pagination관련 설정하기

- DEFAULT_PAGINATION_CLASS에 Pagination 클래스를 설정하고, PAGE_SIZE에 한 번에 가져올 레코드의 수 설정

 

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':
        'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

 

 

Pagination 적용 후 테스트

아래와 같이 한 번에 10개씩의 레코드만 가져오는 것을 확인할 수 있다.
총 데이터의 개수인 count와 이전 10개의 레코드 주소인 previous
다음 10개의 레코드를 위한 next또한 RESPONSE에 생겼다.

 

 

 

유의 사항

Pagination을 사용할 때는 반드시 레코드를 정렬해 사용해야 한다.
=> views.py를 아래와 같이 id로 정렬하도록 수정해준다.

from .models import Post
from .serializer import PostSerializer
from rest_framework import viewsets


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('id')
    serializer_class = PostSerializer

 

CustomizedPagination 클래스 작성하기

PageNumberPagination을 상속받는 클래스를 선언하고
클래스 내부에 page_size변수에 원하는 레코드의 수를 지정한 후
적용할 모델의 ViewSet의 pagination_class에 클래스를 지정하면 된다.

 

...
from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
    page_size = 6

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('id')
    serializer_class = PostSerializer
    pagination_class = MyPagination

지정해준 page 수 대로 잘 정리되는 것을 볼 수 있다

 

코드 클린

1. pagination.py 생성 및 클래스 옮기기

from rest_framework.pagination import PageNumberPagination


class MyPagination(PageNumberPagination):
    page_size = 6

 

2. views.py 에 추가, 사용

from .models import Post
from .serializer import PostSerializer
from .pagination import MyPagination
from rest_framework import viewsets


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all().order_by('id')
    serializer_class = PostSerializer
    pagination_class = MyPagination
반응형

'Web > Django' 카테고리의 다른 글

[Django] Instagram 클론 코딩(3)  (0) 2020.03.20
[Django] Instagram 클론 코딩(2)  (0) 2020.03.19
[Django] Instagram 클론 코딩(1)  (0) 2020.03.17
[Django_심화]3 - viewset & router  (2) 2019.11.03
[Django_심화]2 - Rest, Serializer  (0) 2019.11.03

+ Recent posts