DRF 프레임의 페이지 나누기 기능 인터페이스
1. 프레임워크에서 세 가지 종류를 제공하여 페이지 나누기 기능을 실현한다.PageNumberPagination,LimitOffsetPagination,CursorPagination
Note 페이지 구성 요소의 기본 논리: 페이지 기능을 실현하려면 먼저 데이터베이스에서 모든 데이터를 얻어야 한다. 정상적인 상황에서 데이터를 얻은 후에 직접 실례화된 서열화 클래스를 가져와 데이터를 전방으로 되돌려준다.페이지 구성 요소를 사용하려면 데이터베이스에서 데이터를 얻은 후 실례화 서열화 클래스 이전에 데이터를 페이지 처리하고 처리된 데이터를 instance의 값으로 전달해야 한다.
from rest_framework.pagination import PageNumberPagination
class Page1View(APIView):
user_obj = UserInfo.objects.all()
#
pg = PageNumberPagination()
#
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
# paginate_queryset , :
#1. queryset
2.request=request
3.view , self
serializer = Page1Serializer(instance=page, many=True)
return Response(serializer.data)
# ,
# ,
from rest_framework.pagination import PageNumberPagination
#
class MyPagination(PageNumberPagination):
page_size = 1
#
max_page_size = 4
#
page_query_param = 'page'
#
page_size_query_param = 'size'
#
class Page2View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
# get_paginated_response
return data
3. LimitOffsetPagination을 사용하여 페이지 나누기 기능 구현
이 클래스는 페이지 나누기 기능이 기본적으로 이전 클래스와 일치합니다. get 검색할 때의 매개 변수 이름이 다르고, 이 클래스는 현재 위치의offset (기본값은 0, 설정 가능) 과 편이량limit (즉 페이지당 표시되는 수량) 에 따라 조회됩니다.
from rest_framework.pagination import LimitOffsetPagination
class Page3View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = LimitOffsetPagination()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
return Response(serializer.data)
#
class MyPagination1(LimitOffsetPagination):
default_limit = 1
# ( )
max_limit = 3
#
offset_query_param = 'offset'
# , 0
limit_query_param = 'limit'
#
class Page4View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination1()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
return data
Note CursorPagination도 암호화 페이지가 될 수 있고 페이지 번호를 암호화 처리하여 방문자는 페이지 번호를 수정하여 접근할 수 없다. 이 방식은 PageNumberPagination에 비해 페이지를 나누는 방식이 장점은 사용자가 임의로 페이지 번호를 수정하여 데이터베이스 조회 수량이 너무 많아 데이터베이스 과부하와 조회 속도가 느린 문제를 피하는 것이다. 이것도 데이터베이스 조회 성능이 최적화된 것이다.예를 들어 PageNumberPagination에서 사용자는 직접 페이지 번호를 1000으로 바꿀 수 있지만,CursorPagination에서는 위아래 페이지만 볼 수 있다
from rest_framework.pagination import CursorPagination
class MyPagination2(CursorPagination):
page_size = 1
max_page_size = None
ordering = 'id'
# id
page_size_query_param = None
cursor_query_param = 'cursor'
class Page5View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination2()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
return data
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.