서버로부터 데이터를 받아올 때 한번에 다 받아올 수도 있지만 데이터가 많을 경우 일부분만 받아와야 할 경우가 생긴다. 예를 들면 대부분의 홈페이지에 게시판을 보더라도 한번에 모든 글들을 리스트로 보여주지 않고 아래 숫자로 page 를 넘기는 식으로 구현되어 있는데 이럴 경우에 사용하는 것이 Pagination 이다. Django RestFramework 에서는 기본적으로 Pagination 를 제공하는데 활용한다면 특별한 구현 필요 없이 자동으로 Page 로 구성이 된 형식으로 결과를 받아볼 수 있다. 아래는 공식 guide book 에서 설명한 pagination 이다. 아래의 링크를 보고 따라해도 되고 간단하니 내가 작성한 글을 따라 해도 된다.
https://www.django-rest-framework.org/api-guide/pagination/
1. Setting.py 설정
아래와 같이 REST_FRAMEWORK 의 Default Pagination Class 를 정의해주면 Pagination 된 결과를 확인할 수 있다.
LimitOffsetPagination 은 Parameter 를 통해 limit값과 offset 값을 줄 수 있는데, 예를 들어 get url 마지막에 limit=40&offset=100 이라고 보내준다면 40개의 데이터를 100번째 부터 달라는 의미이다.
Settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}
무튼 Settings.py 만 정의해주면 아래같이 pagination 된 결과를 받을 수 있다. 아래에서 count field 는 총 Data 의 갯수이고 next 와 previous 는 다음 값과 이전 값의 url 이다. 현재는 default page_size 로 100이 선언이 되었기 때문에 다음 페이지가 필요가 없으므로 next가 null 로 비어 있다.
2. Pagination Custom
Default 값으로 선언된 Pagination 말고도 직접 나의 Viewset 이나 GenericAPIView 에 내가 정의한 Pagination 을 할당 해 줄 수 있다. 공식 가이드 처럼 PageNumberPagination 를 override 해서 사용해보자. PageNumberPagination 은 파라미터로 Page 번호만 받는 방식이다.
http://localhost:8000/posts/?page_size=2
views.py 에 PageNumberPagination 을 import 한 후 가이드처럼 LargeResultsSetPagination 이름의 PageNumberPagination 를 override 한 class 를 선언해준다 한번에 가져올 Data 갯수 parameter 로 사용할 page_size 를 정의 해주고 page_query_param 변수에 할당 해준다. max_page_size 는 최대 요청 가능한 page size 값이다.
그리고 아래와 같이 Vieset 의 pagination_class 에 내가 정의한 LargeResultsSetPagination 를 할당해 준다.
이러면 끝이다. 결과를 살펴보자. 참고로 GenericAPIView 에도 똑같은 방식으로 pagination_class 가 존재하고 값을 할당해 줄 수 있다.
views.py
...
from rest_framework.pagination import PageNumberPagination
class LargeResultsSetPagination(PageNumberPagination):
page_size = 3
page_query_param = 'page_size'
max_page_size = 100
class PostViewset(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
pagination_class = LargeResultsSetPagination
page size 가 3으로 되어있고 Data 는 총 4개이기 때문에 next 에 다음 query 가 있는 것을 볼 수 있다.
3. 결과 확인
next 를 눌러보면 다음 Data set 이 보여진다. 4개이니 next는 없고 이전값인 previous query 가 있는 것을 볼 수 있다.
기존에는 단순 results 의 List 만을 가지고 안드로이드의 retrofit 을 사용해서 restAPI 를 호출 하였지만 pagination 을 활용 하니 json 의 구조가 바뀌었다. 안드로이드에 바뀐 구조를 받아오는 restfit 예제도 실습한뒤에 포스팅 하겠다.
'Django' 카테고리의 다른 글
[Django] RestFramework Serializer 댓글 모델 추가하기 (0) | 2019.10.08 |
---|---|
[Django] RestFramework Image file upload ImageField (0) | 2019.10.04 |
[Django] Django-rest-auth 회원가입, 로그인, 로그아웃 예제 (0) | 2019.09.28 |
Django ngrok 설정, 홈 서버 (0) | 2019.09.22 |
Django REST framework 예제 (1) | 2019.09.21 |