day95-分页组件

2020-11-05 10:53:11 浏览数 (1)

1.根据页码和每一页多少条数据做分页,实际配置即可

代码语言:javascript复制
from rest_framework import pagination


# 根据页码和每一页多少条数据做分页
class MyPagination(pagination.PageNumberPagination):
    """
    http://127.0.0.1:8000/api/page?page=2&size=3
    从第2页开始显示,每一页显示3条数据
    """
    # 一页显示两条数据
    page_size = 2
    
    # url 拼接查询关键字,page=n,从第n页开始
    page_query_param = 'page'
    
    # url 拼接查询关键字,size=m,每页显示m条数据,不超过 max_page_size
    page_size_query_param = 'size'
    
    # 每一页给你限定死最多三条数据,即使请求每一超过3条也只显示3条
    max_page_size = 3

1.1进入到PageNumberPagination里面查看可配置其他

2.根据第n条数据和每页数据量做分页,实际配置即可

代码语言:javascript复制
# 根据第n条数据和每页数据量做分页
class LimitOffsetPaginator(pagination.LimitOffsetPagination):
    """
    http://127.0.0.1:8000/api/page?offset=2&limit=4
    从第3条数据开始显示,每一页显示4条数据
    """
    # 每一页默认显示 1 条数据
    default_limit = 1
    # url 拼接查询关键字,limit=n,每一页显示多少条
    limit_query_param = 'limit'
    # url 拼接查询关键字,offset=m,从第m 1条数据开始显示
    offset_query_param = 'offset'

2.1进入到LimitOffsetPagination里面查看可配置其他

3.根据游标分页,只有上一页和下一页

代码语言:javascript复制
# 根据游标分页,只有上一页和下一页
class CursorPaginator(pagination.CursorPagination):
    cursor_query_param = 'cursor'
    # 根据 id 做游标
    ordering = 'id'
    # 每一页显示 2 条数据
    page_size = 2

3.1进入到CursorPagination里面查看可配置其他

4.在视图中使用分页器,先要导入自己写的分页器

代码语言:javascript复制
class PageBookView(APIView):
    def get(self, request):
        queryset = Book.objects.all()

        # 实例化这个分页类
        page_obj = pagination.MyPagination()
        # page_obj = pagination.LimitOffsetPaginator()
        # page_obj = pagination.CursorPaginator()

        # 每一页的 queryset,模型
        page_queryset = page_obj.paginate_queryset(queryset, request)

        # 每一页的分页模型序列化好数据
        ser_obj = BookSerializer(page_queryset, many=True)

        # 该方法封装了一些上一页下一页的链接
        return page_obj.get_paginated_response(ser_obj.data)

5.在三层封装视图里面也可以直接使用和配置

代码语言:javascript复制
# 对全局APIView进行第三次封装
class BookModelView(viewsets.ModelViewSet):
    # 同样配置 queryset 和 serializer_class
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class = pagination.MyPagination
    # pagination_class = pagination.LimitOffsetPaginator
    # pagination_class = pagination.CursorPaginator

5.1注意直接使用的是 DRF 直接提供继承的 viewsets.ModelViewSet,不是 day93自己写的

5.2进入viewsets.ModelViewSet可以看到其实它已经帮助我们直接继承了所有的类。我们做的都是配置工作

0 人点赞