본문 바로가기
source-code/Django

Djagno REST Framework _ Pagination 사용하기

by mattew4483 2021. 2. 15.
728x90
반응형

모든 요청을 한 페이지에 담는다면? 보기도 힘들뿐더러 시간도 오래 걸릴 테다.

따라서 페이지를 나눠 요청을 보내게 되는데...

우리의 친절한 DRF는 이러한 pagination 기능을 제공한다!

www.django-rest-framework.org/api-guide/pagination/

 

Pagination - Django REST framework

pagination.py Django provides a few classes that help you manage paginated data – that is, data that’s split across several pages, with “Previous/Next” links. — Django documentation REST framework includes support for customizable pagination styl

www.django-rest-framework.org

오늘도 역시 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를 돌려보면...

http://127.0.0.1:8000/api/posts/

원래는 Post만 있었는데! 새로운 녀석들이 생겨났다.

count → 총 Data의 개수

next, previous → 다음, 이전 값의 url

results → 현재 페이지에서의 Data

 

근디 왜 next와 previous가 null로? PAGE_SIZE가 100이라 이전, 다음 페이지가 필요가 없으니까!

 

따라서 이렇게 바꿔버리면...

한 페이지 당 4개만 보여야 한다!

 

진짜 그런지 runserver를 돌리면?

http://127.0.0.1:8000/api/posts/

와우! 똑같은 URL 요청에도 결과물이 다르다!

4개의 Post만 보일뿐더러 next에 URL이 생겼다. 

 

요 녀석을 눌러보면?

http://127.0.0.1:8000/api/posts/?limit=4&offset=4

다음 페이지로 이동한 걸 볼 수 있다. 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로 돌아와서...

views.py

PageNumberPagination을 오버라이딩 해주면 된다!

공식 문서처럼 많은 결과/적은 결과를 보여줄 두 개의 Custom Pagination을 만들었다.

 

page_size → 한 번에 가져올 Data 개수

page_size_query_param URL 파라미터로 사용할 값

max_page_size → 최대 요청 가능한 page_size

 

views.py

Custom Pagination을 적용하고 싶은 view에 지정해주면 된다.

pagination_class를 적은 결과를 보여줄 StandardResultsSetPagination로!

 

이제 다시 runserver를 돌리면...

http://127.0.0.1:8000/api/posts/

쨔잔. 아까와 같은 화면.

settings로 지정한 것이 아니기 때문에, 각 view마다 다른 pagination을 적용할 수 있다! 와우!

 

또한 PageNumberPagination을 적용했기 때문에 next의 URL이 페이지 번호만으로 이뤄진 걸 볼 수 있다.

 

이렇게 Custom 한 값은 settings에 Default로 지정한 값을 덮어 씌운다.

따라서 개별적으로 사용해야 하는 경우가 있더라도,

우선 settings에서 전체적인 값을 설정한 후, 개별 설정을 추가하는 것이 낫다나 뭐라나...

728x90
반응형