PageNumberPagination

김기훈·2026년 2월 20일

Django

목록 보기
5/17

사용

개인프로젝트 - 블로그 만들기


PageNumberPagination

QuerySet 잘라내기

  • paginate_queryset(self, queryset, request, view=self)

    • request에서 페이지 번호를 확인
    • 설정된 page_size 만큼 쿼리셋을 슬라이싱(OFFSET, LIMIT)합니다.
    • 성공 시 페이지 객체를 반환하고, 실패 시(페이지 없음 등) NotFound 예외를 발생
  • view

    • 메서드에서 view 파라미터는 현재 페이지네이션을 호출하고 있는
      • API View의 인스턴스(객체)
      • 보통 View 내부에서 view=self와 같은 방식으로 전달됩니다.
    • View에 정의된 속성 참조( PageNumberPagination )

      • 페이지 크기(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 설정을 확인하여 무분별하게 많은 데이터를 요청하지 못하도록 제한

profile
안녕하세요.

0개의 댓글