
사용
QuerySet 잘라내기
paginate_queryset(self, queryset, request, view=self)
request에서 페이지 번호를 확인
- 설정된
page_size 만큼 쿼리셋을 슬라이싱(OFFSET, LIMIT)합니다.
- 성공 시 페이지 객체를 반환하고, 실패 시(페이지 없음 등)
NotFound 예외를 발생
view
- 메서드에서 view 파라미터는 현재 페이지네이션을 호출하고 있는
- API View의 인스턴스(객체)
- 보통 View 내부에서 view=self와 같은 방식으로 전달됩니다.
- 페이지 크기(page_size) 등을 결정할 때 페이지네이터 클래스 자체의 설정뿐만 아니라
- View 클래스에 개별적으로 정의된 속성을 참고할 수 있습니다.
ex
- 특정 View에서만 한 페이지에 5개씩 보여주고 싶어서 View 클래스에 page_size = 5
- 페이지네이터는 전달받은 view 인스턴스를 통해 이 값을 읽어와 적용 가능
동적인 페이지네이션 설정
- 단일 페이지네이터 클래스를 여러 View에서 공유할 때
- 어떤 View에서 호출했느냐에 따라 동작을 다르게 하고 싶을 때 사용함
if isinstance(view, PostAPIView)
- 위 조건문을 사용하여 특정 API에서만 특수한 로직을 수행하도록 코드를 짤 수 있음
DRF 표준 규격 및 확장성 (Consistency)
- DRF의 모든 페이지네이션 클래스
LimitOffsetPagination, CursorPagination등은 동일한 메서드 구조를 가짐
- CursorPagination
- 과 같은 다른 방식에서는 정렬 기준(ordering)을 View에서
- 가져와야 하기 때문에 view 객체가 필수적입니다.
- PageNumberPagination
- 나중에 기능을 확장하거나 다른 페이지네이션으로 교체할 때를 대비해
- 컨텍스트(Context, 맥락) 정보를 유지하기 위해 전달하는 것
최종 JSON 형태로 포장
get_paginated_response(self, data)
- count, next, previous, results 키를 가진 Response 객체를 생성
- 데이터의 형식을 전역적으로 통일할 때 가장 많이 커스텀하는 메서드
페이지 url 생성
get_next_link(self) & get_previous_link(self)
- 현재 요청의 호스트명과 쿼리 파라미터를 유지하면서 페이지 번호만 바꾼 URL을 만듬
- get_paginated_response 내부에서 자동으로 호출되어 next와 previous 값을 채움
한 페이지에 보여줄 데이터의 개수를 결정
get_page_size(self, request)
- 기본 설정값(page_size)을 가져옴
- 클라이언트가 보낸 쿼리 파라미터(예: ?size=20)가 있다면 그 값을 검증하고 반환
- max_page_size 설정을 확인하여 무분별하게 많은 데이터를 요청하지 못하도록 제한