博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3月8日学习内容整理:restframework的分页组件
阅读量:5811 次
发布时间:2019-06-18

本文共 3472 字,大约阅读时间需要 11 分钟。

一、分页

1、第一种情况是看第几页,每页显示多少条数据:使用PageNumberPagination内置类

(1)代码:注意每页显示几条数据的page_size 参数也可以写在配置文件中

from rest_framework.pagination import PageNumberPaginationclass PagerSerialiser(serializers.ModelSerializer):    class Meta:        model = models.Role        fields = "__all__"class MyPageNumberPagination(PageNumberPagination):    # 默认每页显示几条数据    page_size = 2    # 在URL中GET数据中的key,用来修改每页显示数据数    page_size_query_param = 'size'    # 定义每页显示数据的最大数    max_page_size = 5    # 在URL中GET数据的key,用来指定查看第几页的数据    page_query_param = 'page'class Pager1View(APIView):    def get(self, request, *args, **kwargs):        # 获取所有数据        roles = models.Role.objects.all()        # 创建分页对象        pg = MyPageNumberPagination()        # 在数据库中获取分页的数据        # 参数queryset就是查询到的数据        # 参数request就是封装的Request对象        # 参数view就是自定义view类的对象        pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)        # 对数据进行序列化        # 参数instance就是分页之后的数据        ser = PagerSerialiser(instance=pager_roles, many=True)        # 使用渲染器,后面会说到        return Response(ser.data)

 

 

(2)分页对象的get_paginated_response方法

pg.get_paginated_response(这里就传分页之后序列化的数据ser.data)

返回执行结果,页面上就会显示除了数据以外的更多信息,包括下一页的url地址

 

2、第二种情况是定位到某个位置,往后看几条数据:使用LimitOffsetPagination内置类

from rest_framework.response import Responsefrom rest_framework.pagination import PageNumberPagination, LimitOffsetPaginationclass PagerSerialiser(serializers.ModelSerializer):    class Meta:        model = models.Role        fields = "__all__"class MyLimitOffsetPagination(LimitOffsetPagination):    # 默认往后看2条数据    default_limit = 2    # 指定URL的GET数据中的key,用来修改往后看几条数据    limit_query_param = 'limit'    # 指定URL的GET数据中的key,用来修改起始位置,表示索引    offset_query_param = 'offset'    # 定义往后看的数据条数的最大值    max_limit = 5class Pager1View(APIView):    def get(self, request, *args, **kwargs):        # 获取所有数据        roles = models.Role.objects.all()        # 创建分页对象        pg = MyLimitOffsetPagination()        # 在数据库中获取分页的数据        pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)        # 对数据进行序列化        ser = PagerSerialiser(instance=pager_roles, many=True)        return Response(ser.data)        # 也可以返回更多的信息,显示下一页的URL地址        # return pg.get_paginated_response(ser.data)

 

3、第三种情况是加密分页,不显示页码,只显示上一页和下一页,也叫游标分页,使用内置类

特点就是每一页的页码是加密的,不是简单的1,2,3之类,所以在URL中我们无法用GET数据的key来查看具体某一页的数据,这里就要用到上面说到的分页对象的get_paginated_response方法,这样在页面上就会显示出上一页和下一页的url地址了

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPaginationclass PagerSerialiser(serializers.ModelSerializer):    class Meta:        model = models.Role        fields = "__all__"class MyCursorPagination(CursorPagination):    # 指定URL的GET数据中的key,用来查看具体的某一页数据    cursor_query_param = 'cursor'    # 默认每页显示几条数据    page_size = 2    # 按什么字段进行排序    # 这里就是按照id值升序排序    # 若是-id就是按照id值降序排序    ordering = 'id'    # 指定URL的GET数据中的key,用来修改每页显示的数据条数    page_size_query_param = None    # 指定每页显示数据条数的最大值    max_page_size = Noneclass Pager1View(APIView):    def get(self, request, *args, **kwargs):        # 获取所有数据        roles = models.Role.objects.all()        # 创建分页对象        pg = MyCursorPagination()        # 在数据库中获取分页的数据        pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)        # 对数据进行序列化        ser = PagerSerialiser(instance=pager_roles, many=True)        # 利用get_paginated_response返回上一页和下一页的url地址        return pg.get_paginated_response(ser.data)

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8528705.html

你可能感兴趣的文章