모든 요청을 한 페이지에 담는다면? 보기도 힘들뿐더러 시간도 오래 걸릴 테다.
따라서 페이지를 나눠 요청을 보내게 되는데...
우리의 친절한 DRF는 이러한 pagination 기능을 제공한다!
www.django-rest-framework.org/api-guide/pagination/
오늘도 역시 DRF 공식문서를 참고.
1. Default Pagination
전역으로 pagination을 사용하고 싶다면? → settings에서 이를 지정해주면 된다!
setting.py
중간에 DEFAULT_PAGINATION_CLASS와 PAGE_SIZE를 지정!
(원래는 default로 None이 지정되어 있다)
이때 지정해준 PAGE_SIZE가 한 번에 가져올(한 페이지에 보여줄) Data의 개수되시겠다.
여기서 LimitOffsetPagination은 URL 파라미터를 통해 limit값과 offset 값을 줄 수 있다.
이게 무슨 소리?
예를 들어 GET 요청 마지막에 limit=40&offset=100 이라고 보내준다면, 40개의 데이터를 100번째부터 달라는 뜻!
이렇게만 적어두고 runserver를 돌려보면...
원래는 Post만 있었는데! 새로운 녀석들이 생겨났다.
count → 총 Data의 개수
next, previous → 다음, 이전 값의 url
results → 현재 페이지에서의 Data
근디 왜 next와 previous가 null로? → PAGE_SIZE가 100이라 이전, 다음 페이지가 필요가 없으니까!
따라서 이렇게 바꿔버리면...
한 페이지 당 4개만 보여야 한다!
진짜 그런지 runserver를 돌리면?
와우! 똑같은 URL 요청에도 결과물이 다르다!
4개의 Post만 보일뿐더러 next에 URL이 생겼다.
요 녀석을 눌러보면?
다음 페이지로 이동한 걸 볼 수 있다. Pagination 정상 작동!
뒤에 붙은 limit=4&offset=4의 뜻도 이미 알고 있다.
→ 4개의 Data(PAGE_SIZE가 4니까)를 4번째부터(앞 페이지에서 4개를 보여줬으니까) 달라는 의미!
2. Custom Pagination
그런데 각 페이지마다 다른 Pagination 설정을 주고 싶다면? → Custom이 필요하다!
즉 직접 ViewSet이나 GenericAPIView에 자신이 정의한 Pagination을 입혀줄 수 있는 것.
아까 지정한 Default Pagination은 몽땅 지워버린 후, View에 들어가자.
views.py
우선 PageNumberPagination을 import!
이 녀석은 URL 파라미터로 Page 번호만 받는 형식.
이건 또 무슨 말? → 나중 가면 알 수 있다!
아차차, 그리고 이 녀석도 Default Pagination으로 settings에서 지정해줄 수 있다!
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination'
↑ settings에서 이렇게 지정해주면 LimitOffsetPagination 대신 PageNumberPagination 형식을 사용한 것!
아무튼 다시 view로 돌아와서...
요 PageNumberPagination을 오버라이딩 해주면 된다!
공식 문서처럼 많은 결과/적은 결과를 보여줄 두 개의 Custom Pagination을 만들었다.
page_size → 한 번에 가져올 Data 개수
page_size_query_param → URL 파라미터로 사용할 값
max_page_size → 최대 요청 가능한 page_size
Custom Pagination을 적용하고 싶은 view에 지정해주면 된다.
pagination_class를 적은 결과를 보여줄 StandardResultsSetPagination로!
이제 다시 runserver를 돌리면...
쨔잔. 아까와 같은 화면.
settings로 지정한 것이 아니기 때문에, 각 view마다 다른 pagination을 적용할 수 있다! 와우!
또한 PageNumberPagination을 적용했기 때문에 next의 URL이 페이지 번호만으로 이뤄진 걸 볼 수 있다.
이렇게 Custom 한 값은 settings에 Default로 지정한 값을 덮어 씌운다.
따라서 개별적으로 사용해야 하는 경우가 있더라도,
우선 settings에서 전체적인 값을 설정한 후, 개별 설정을 추가하는 것이 낫다나 뭐라나...
'source-code > Django' 카테고리의 다른 글
Django REST Framework _ Postman 사용하기 (0) | 2021.02.16 |
---|---|
Django REST Framework _ 회원가입 구현하기 (0) | 2021.02.15 |
Django REST Framework _ ViewSets & Router 이용하기 (0) | 2021.02.10 |
단위 테스트를 이용한 홈페이지 테스트 (0) | 2021.02.10 |
debug-tool-bar 이용하기 (0) | 2021.02.09 |