Django REST Framework 페이지(Pagination)상세 설명
페이지 를 나누다
페이지 를 왜 나 눠 요?데이터베이스 데이터 의 양 이 매우 많 을 때,만약 한 번 에 이 데 이 터 를 조회 한다 면,반드시 서버 메모리 의 부 하 를 증가 시 켜 시스템 의 운행 속 도 를 낮 출 것 이다.더 좋 은 방법 은 데이터 세그먼트 를 사용자 에 게 보 여 주 는 것 이다.사용자 가 보 여 준 세그먼트 데이터 에서 자신의 내용 을 찾 지 못 하면 원 하 는 내용 을 찾 을 때 까지 페이지 번호 나 페이지 를 넘 기 는 방식 으로 더 많은 데 이 터 를 볼 수 있 습 니 다.
Django REST Framework 는 3 가지 페이지 클래스 를 제공 합 니 다.다음 에 저 희 는 각각 프 리 젠 테 이 션 을 진행 할 것 입 니 다.
DRF 에서 기본 페이지 클래스 를 사용 하 는 가장 쉬 운 방법 은 settings.py 에서 전역 설정 을 하 는 것 입 니 다.다음 과 같 습 니 다.
REST_FRAMEWORK ={
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':2
}
전시 효 과 는 다음 과 같 습 니 다.각 페이지 에 두 개의 기록 을 보 여 줍 니 다.사용자 가 각 페이지 에 데 이 터 를 보 여 주 는 수량 을 지정 하 는 것 은 지원 되 지 않 습 니 다.하지만 사용자 가 누 르 기 를 원한 다 면?page=3&size=10 이라는 더욱 유연 한 방식 으로 조 회 를 하려 면 맞 춤 형 맞 춤 형 제작 을 해 야 한다.실제 개발 과정 에서 맞 춤 형 제작 은 기본 페이지 류 를 사용 하 는 것 보다 더 흔 하 며 구체 적 인 방법 은 다음 과 같다.
첫 번 째 단계:app 디 렉 터 리 에 pagination.py 를 새로 만 들 고 다음 코드 를 추가 합 니 다.
#blog/pagination.py
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
page_size = 2 # default page size
page_size_query_param = 'size' # ?page=xx&size=??
max_page_size = 10 # max page size
Google 은 PageNumberPagination 클래스 를 사용자 정의 합 니 다.이 클래스 는 PageNumberPagination 클래스 를 계승 합 니 다.우 리 는 페이지 를 통 해size 는 각 페이지 의 기본 데 이 터 를 보 여 주 는 줄 수 를 설정 하고 page 를 통 해size_query_param 은 각 페이지 size 의 매개 변수 이름 을 설정 하고 max 를 통 해page_size 는 보 여줄 수 있 는 최대 데이터 줄 수 를 설정 합 니 다.두 번 째 단계:사용자 정의 페이지 클래스 사용
클래스 기반 보기에 서 pagination 을 사용 할 수 있 습 니 다.class 이 속성 은 사용자 정의 페이지 클래스 를 사용 합 니 다.다음 과 같 습 니 다.
from rest_framework import viewsets
from .pagination import MyPageNumberPagination
class ArticleViewSet(viewsets.ModelViewSet):
# ArticleList ArticleDetail
queryset = Article.objects.all()
serializer_class = ArticleSerializer
pagination_class = MyPageNumberPagination
# , request.user author
def perform_create(self, serializer):
serializer.save(author=self.request.user)
# , request.user author
def perform_update(self, serializer):
serializer.save(author=self.request.user)
전시 효 과 는 다음 과 같다.물론 맞 춤 형 페이지 클래스 는 지정 페이지 에 국한 되 지 않 습 니 다.size 와 maxpage_size 이 속성 들 은 데이터 에 응답 하 는 출력 형식 도 바 꿀 수 있 습 니 다.예 를 들 어 next 와 previous 를 links 라 는 key 에 넣 고 싶 습 니 다.MyPageNumberPagination 류 를 수정 하고 get 을 다시 쓸 수 있 습 니 다.paginated_response 방법:
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
class MyPageNumberPagination(PageNumberPagination):
page_size = 2 # default page size
page_size_query_param = 'size' # ?page=xx&size=??
max_page_size = 10 # max page size
def get_paginated_response(self, data):
return Response({
'links': {
'next': self.get_next_link(),
'previous': self.get_previous_link()
},
'count': self.page.paginator.count,
'results': data
})
새로운 전시 효 과 는 다음 과 같다.메모:다시 쓰기 getpaginated_response 방법 은 매우 유용 합 니 다.페이지 응답 데이터 에 추가 적 인 내용 을 전달 할 수 있 습 니 다.예 를 들 어 code 상태 코드 등 입 니 다.
앞의 예 에서 우 리 는 클래스 기반 보기 나 보기 에서 만 페이지 클래스 에 집중 적 으로 사 용 했 습 니 다.settings.py 전역 에서 사용자 정의 페이지 클래스 를 사용 할 수 있 습 니 다.다음 과 같 습 니 다.전시 효과 가 같 으 니 우 리 는 상세 하 게 설명 하지 않 겠 다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyPageNumberPagination',
}
LimitOffset Pagination 클래스 사용 하기이 페이지 클래스 를 사용 하 는 가장 간단 한 방법 은 settings.py 에서 전역 설정 을 하 는 것 입 니 다.다음 과 같 습 니 다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}
전시 효 과 는 다음 과 같 습 니 다.6 조 데 이 터 를 찾 아 보면 페이지 당 2 조 를 보 여 줍 니 다.MyLimit Offset Pagination 클래스 를 사용자 정의 할 수 있 습 니 다.단일 보기 나 보기에 서 집중 적 으로 사용 하거나 전역 적 으로 사용 할 수 있 습 니 다.
from rest_framework.pagination import LimitOffsetPagination
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 5 # default limit per age
limit_query_param = 'limit' # default is limit
offset_query_param = 'offset' # default param is offset
max_limit = 10 # max limit per age
CursorPagination 클래스 사용 하기전역 사용
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
'PAGE_SIZE': 2
}
전시 효 과 는 다음 과 같다.뭐?왜 잘못 됐어 요?Cursor Pagination 클래스 를 사용 하려 면 모델 에 created 필드 가 있어 야 합 니 다.그렇지 않 으 면 ordering 필드 를 수 동 으로 지정 해 야 합 니 다.Cursor Pagination 클래스 는 정렬 된 조회 집합 만 페이지 별로 표시 할 수 있 기 때 문 입 니 다.우리 Article 모델 은 create 밖 에 없어 요.date 필드,created 이 필드 가 없어 서 오류 가 발생 할 수 있 습 니 다.
이 문 제 를 해결 하기 위해 서 는 MyCursor Pagination 류 를 사용자 정의 하고 create 를 수 동 으로 지정 해 야 합 니 다.date 정렬 은 다음 과 같 습 니 다.
#blog/pagination.py
from rest_framework.pagination import CursorPagination
class MyArticleCursorPagination(CursorPagination):
page_size = 3 # Default number of records per age
page_size_query_param = 'page_size'
cursor_query_param = 'cursor' # Default is cursor
ordering = '-create_date'
settings.py 를 수정 하고 자신 이 정의 한 페이지 클래스 를 사용 합 니 다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyArticleCursorPagination',
}
응답 효 과 는 다음 과 같 습 니 다.previous 와 next 페이지 링크 를 얻 을 수 있 습 니 다.페이지 번호 가 암호 화 되 어 링크 에 페이지 번호 가 표시 되 지 않 습 니 다.기본 페이지 당 3 개의 기록 을 보 여 줍 니 다.사용 하면?page_size=2 조 회 를 진행 하면 페이지 당 두 개의 기록 을 얻 을 수 있 습 니 다.물론 이 ordering 필드 는 모델 과 관련 되 어 있 기 때문에 사용자 정의 CursorPagination 류 를 전역 적 으로 사용 하 는 것 을 추천 하지 않 습 니 다.더 좋 은 방법 은 GenericsAPIView 나 그림 집 view sets 에서 pagination 을 통 해class 속성 지정,다음 과 같 습 니 다:
from rest_framework import viewsets
from .pagination import MyArticleCursorPagination
class ArticleViewSet(viewsets.ModelViewSet):
# ArticleList ArticleDetail
queryset = Article.objects.all()
serializer_class = ArticleSerializer
pagination_class = MyArticleCursorPagination
# , request.user author
def perform_create(self, serializer):
serializer.save(author=self.request.user)
# , request.user author
def perform_update(self, serializer):
serializer.save(author=self.request.user)
함수 클래스 보기 에서 페이지 클래스 사용 하기pagination 주의class 속성 은 genericsAPIView 와 그림 집합 viewset 에서 만 설정 할 수 있 습 니 다.함수 나 간단 한 APIView 를 사용 하여 API 보 기 를 개발 하려 면 데 이 터 를 수 동 으로 페이지 를 나 누 어야 합 니 다.구체 적 인 사용 예 는 다음 과 같 습 니 다.
from rest_framework.pagination import PageNumberPagination
class ArticleList0(APIView):
"""
List all articles, or create a new article.
"""
def get(self, request, format=None):
articles = Article.objects.all()
page = PageNumberPagination() #
page.page_size = 3 #
page.page_query_param = 'page' # page
page.page_size_query_param = 'size' #
page.max_page_size = 10 # ,
ret = page.paginate_queryset(articles, request)
serializer = ArticleSerializer(ret, many=True)
return Response(serializer.data)
작은 매듭본 고 는 DRF 가 제공 하 는 세 가지 페이지 유형 을 정리 하고 이 를 어떻게 사용 하 는 지 상세 하 게 보 여 주 었 습 니 다.배 웠 습 니까?
Django REST Framework 페이지(Pagination)에 대한 자세 한 설명 은 여기까지 입 니 다.더 많은 Django REST Framework 페이지 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.