Loading

三种分页方式、 继承APIView实现分页

三种分页方式

什么样接口要分页---->获取所有

三种分页方式--->继承GenericAPIView,ListModelMixin
	-list方法--->

分页的使用

from rest_framework.pagination 下的

PageNumberPagination

LimitOffsetPagination

CursorPagination

基本分页:正常的查第几页,每页显示多少条的方式--->常用

class CommonPageNumberPagination(PageNumberPagination):
    #4 个类属性
    page_size = 2     #每页显示条数
    page_query_param = 'page'   # 查询页码参数  ?page=10
    page_size_query_param = 'size' #  ?page=3&size=5000
    max_page_size = 5              #可以通过size控制每页显示的条数,但是通过这个参数控制最多显示多少条

# http://127.0.0.1:8000/books/?page=1&size=300000

偏移分页

class CommonLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2    # 每页显示多少条
    limit_query_param = 'limit'   # 取多少条
    offset_query_param = 'offset' #从第0个位置偏移多少开始取数据
    max_limit = 5     # 最大限制条数
    # offset=6&limit=90000
    # http://127.0.0.1:8000/books/?limit=3&offset=3  # 从第三条开始取3条

    # limit_query_description = _('Number of results to return per page.')

游标分页

针对于大数据量分页效率高

可控性差

只能选择上一页和下一页,不能直接跳转到某一个

class CommonCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询的名字  等同于  page=xx
    page_size = 3  # 每页显示多少条
    ordering = 'id'  # 排序规则,必须是表中有的字段,一般用id
#http://127.0.0.1:8000/books/?cursor=cD0z

views.py

from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from .models import Book
from .serializer import BookSerializer

# 三种分页方式:
from .page import CommonPageNumberPagination as PageNumberPagination
from .page import CommonLimitOffsetPagination
from .page import CommonCursorPagination
class BookView(GenericAPIView,ListModelMixin):
class BookView(GenericViewSet, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
	# 只需要继承自己想要使用的分页方式就可以了,就是上面自己写的分页类
    pagination_class= CommonCursorPagination

继承APIView实现分页

# APIView实现分页
from rest_framework.views import APIView
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
class BookView(ViewSet):
    def list(self,request):
        books=Book.objects.all()
        # 分页
        # paginator=PageNumberPagination()
        paginator=CommonLimitOffsetPagination()
        #分页过后的数据
        qs=paginator.paginate_queryset(books,request,self)
        #序列化
        ser=BookSerializer(qs,many=True)
        # 第一种方式:每页总条数,上一页,下一页
        # return Response(ser.data)
        # 第二种:自己凑
        # return Response({
        #     'count':books.count(),
        #     'next': paginator.get_next_link(),
        #     'previous':paginator.get_previous_link(),
        #     'results': ser.data
        # })
        # 第三种;直接使用分页类的方法
        return paginator.get_paginated_response(ser.data)

posted @ 2022-06-26 17:47  香菜根  阅读(187)  评论(0编辑  收藏  举报