API 서버에서 Pagination
-> 사용자가 게시판의 전체 글 목록 요청 시 /
수 많은 데이터들을 한번에 전달 한다면 데이터를 받는 사용자는 많은 데이터를 감당할 수 없을 것
API 서버에서 Pagination을 사용하는 이유
- > 하나의 Request 만으로 처리하기 어려운 레코드들을 여러 Request로 나누어 전송하기 위해 사용
DRF에서의 Pagination
- PageNumberPagination
- LimitOffsetPagination
- CursorPagination
- 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
코드 클린
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 |