REST-framework快速构建API--分页

摘要:
REST框架支持自定义分页样式。您可以修改每页上显示的数据集的最大长度。使用可浏览API的用户更容易接受这种风格。如果使用APIView,则需要自己调用分页API以确保返回分页响应。rest框架提供了三种分页方法:BasePagination不是一种分页方法,而是定义了几个基本函数。分页方法1.PageNumberPage顾名思义,就是分页。结果按页码分页。page=4&page_Size=100“”2.限制偏移分页:偏移值分页。偏移=400&limit=100“”3.光标分页:光标分页。
分页简介

当数据量特别大的时候,我们通过API获取数据会非常慢,所以此时我们需要将数据"分批次"取出来,这里的"分批次"就是,分页!

REST框架支持自定义分页风格,你可以修改每页显示数据集合的最大长度。
分页链接支持以下两种方式提供给用户:

  • 分页链接是作为响应内容提供给用户
  • 分页链接被包含在响应头中(Content-Range或者Link)

内建风格使用作为响应内容提供给用户。这种风格更容易被使用可浏览API的用户所接受。

  • 如果使用通用视图或者视图集合。系统会自动帮你进行分页。
  • 如果使用的是APIView,你就需要自己调用分页API,确保返回一个分页后的响应。

可以将pagination_class设置为None关闭分页功能。

rest-framework自带的分页方式有三种:

REST-framework快速构建API--分页第1张

其中BasePagination不是分页方式,只是定义了几个基础功能。

分页方式

1、PageNumberPagination

顾名思义:页码分页,通过页码对结果进行分页。我们可以指定显示第几页,每页显示多少条数据。

"""
    A simple page number based style that supports page numbers as
    query parameters. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&page_size=100
    """

  

2、LimitOffsetPagination
顾名思义:偏移值分页。通过设置数据的偏移值来进行分页。比如指定偏移值为100,则数据从101条开始获取,同时可以指定每页限制显示多少条数据。

"""
    A limit/offset based style. For example:

    http://api.example.org/accounts/?limit=100
    http://api.example.org/accounts/?offset=400&limit=100
    """

  

3、CursorPagination

顾名思义:游标分页。游标分页预示着分页方式非常复杂。

"""
    The cursor pagination implementation is necessarily complex.
    For an overview of the position/offset style we use, see this post:
    https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api
    """

1、PageNumberPagination(页码分页)

定义分页类

class StandardResultsSetPagination(PageNumberPagination):
    # 默认每页显示的数据条数
    page_size = 1
    # 获取URL参数中设置的每页显示数据条数
    page_size_query_param = 'page_size'

    # 获取URL参数中传入的页码key
    page_query_param = 'page'

    # 最大支持的每页显示的数据条数
    max_page_size = 3

  

2、LimitOffsetPagination(偏移分页)

定义分页类

class StandardResultsSetPagination(LimitOffsetPagination):
    # 默认每页显示的数据条数
    default_limit = 2
    # URL中传入的显示数据条数的参数
    limit_query_param = 'limit'
    # URL中传入的数据位置的参数
    offset_query_param = 'offset'
    # 最大每页显得条数
    max_limit = 3

  

3、CursorPagination(游标分页)

定义分页类

class StandardResultsSetPagination(CursorPagination):
    # URL传入的游标参数
    cursor_query_param = 'cursor'
    # 默认每页显示的数据条数
    page_size = 3
    # URL传入的每页显示条数的参数
    page_size_query_param = 'page_size'
    # 每页显示数据最大条数
    max_page_size = 5

    # 根据ID从大到小排列
    ordering = "id"
应用

视图层面应用

视图层面有两种方式:

  1. APIView
  2. ModelView

1、APIView方式

APIView方式,我们需要自己在get方法中对queryset进行手动分页,实现如下:

class PublishView(APIView):
    def get(self, request):

        # restframework
        # 取数据
        # print("request.data", request.data)
        # print("request.data type", type(request.data))
        # print(request._request.GET)
        # print(request.GET)
        # 序列化
        # 方式1:
        # publish_list=list(Publish.objects.all().values("name","email"))

        # 方式2:
        # from django.forms.models import model_to_dict
        # publish_list=Publish.objects.all()
        # temp=[]
        # for obj in publish_list:
        #     temp.append(model_to_dict(obj))

        # 方式3:
        # from django.core import serializers
        # ret=serializers.serialize("json",publish_list)

        # 序列组件

        publish_list = Publish.objects.all()
        #分页初始化
        paginator = StandardResultsSetPagination()
        #将queryset进行分页
        page_publish_list = paginator.paginate_queryset(publish_list, self.request, view=self)
        #将分页后的数据进行序列化
        ps = PublishModelSerializers(page_publish_list, many=True)
        #通过rest-framework的响应器返回数据
        response = paginator.get_paginated_response(ps.data)
        #return response #包含上一页,下一页的返回方式
        #不包含上一页、下一页的返回方式
        return Response(ps.data)

  

2、ModelView方式

class AuthorModelView(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth, ]
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers
    pagination_class = StandardResultsSetPagination

  

应用层面应用

应用层面也有两种方式:

  1. 局部应用
  2. 全局应用

1、局部应用

utils.py

class StandardResultsSetPagination(CursorPagination):
    # URL传入的游标参数
    cursor_query_param = 'cursor'
    # 默认每页显示的数s据条数
    page_size = 1
    # URL传入的每页显示条数的参数
    page_size_query_param = 'page_size'
    # 每页显示数据最大条数
    max_page_size = 5

    # 根据ID从大到小排列
    ordering = "id"

  注意:page_size=1

REST-framework快速构建API--分页第2张

自定义分页类,继承StandardResultsSetPagination:

class AuthorModelView(viewsets.ModelViewSet):

    class Mypaginations(StandardResultsSetPagination):
        page_size = 3
    authentication_classes = [TokenAuth, ]
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers
    pagination_class = Mypaginations

  

REST-framework快速构建API--分页第3张

  

2、全局应用

全局定义page_size:

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.utils.TokenAuth",],
    "DEFAULT_PERMISSION_CLASSES": ["app01.utils.SVIPPermission", ],
    'DEFAULT_PAGINATION_CLASS': 'app01.utils.StandardResultsSetPagination',
    'PAGE_SIZE': 2,

}

 

函数内不定义page_size:

class StandardResultsSetPagination(CursorPagination):
    # URL传入的游标参数
    cursor_query_param = 'cursor'
    # 默认每页显示的数s据条数
    #page_size = None
    # URL传入的每页显示条数的参数
    page_size_query_param = 'page_size'
    # 每页显示数据最大条数
    max_page_size = 5

    # 根据ID从大到小排列
    ordering = "id"

  

views.py

class AuthorModelView(viewsets.ModelViewSet):

    authentication_classes = [TokenAuth, ]
    queryset = Author.objects.all()
    serializer_class = AuthorModelSerializers
    pagination_class = StandardResultsSetPagination

  

效果图:

REST-framework快速构建API--分页第4张

 

 

免责声明:文章转载自《REST-framework快速构建API--分页》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇H5新增的标签总结卸载趋势下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue 使用 Element 组件实现前端自己的分页功能

Vue 使用 Element 组件实现前端自己的分页功能 当后端没有分页的时候 用 element 中的组件分页并不能对数据进行切割 需要请求回数据后自己来做切割。 <el-table :data="tableData.slice((currentPage-1)*pageSize,currentPage*pageSize)" : style=" 1...

HBase表数据分页处理

HBase表数据分页处理 HBase是Hadoop大数据生态技术圈中的一项关键技术,是一种用于分布式存储大数据的列式数据库,关于HBase更加详细的介绍和技术细节,朋友们可以在网络上进行搜寻,笔者本人在接下来的日子里也会写一个HBase方面的技术专题,有兴趣的朋友们可以稍微的期待一下。不过本章节的重点是介绍下HBase表数据的分页处理,其他的就不多说了。...

Paginator分页

1,分页 Django提供了数据分页的类,这些类被定义在django/core/paginator.py中 对象Paginator用于对列进行一页n条数据的分页运算 对象Page用于表示第m页的数据 2,Paginator对象 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数 属性count:返回对象总数 属性num_pag...

EF分页

先来看看几个LINQ to SQL的几个函数。  Take     说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。     var q = (     from e in db.Employees     orderby e.HireDate     select e)     .Take(5);     语句描述:选择所雇用的前5个雇员。...

记录: Sql 常见分页方法总结

Sql server 2005 分页使用样例, 写下备忘。 sql 分页语句 withtblinfozero--随便取个表别名as(selectartid,arttitle,author,pubtime.pubip,--筛选的字段row_number()over(orderbyartiddesc)as'rowID'/*****row_number()函数的...

pgsql数据库分页排序问题

order by id desc limit 5;//输出前五行刚开始我以为我写错,后来一问,原来是我在js获取数据的时候少打了空格,所以 where 后面要打空格, "desc " 后面 也要打空格。其实这个分页排序问题还蛮多的。具体的视情况而定。...