我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来.

因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取.

同样,展示的时候也是一样的,我们必定会对数据进行分页显示.

本文将详细讲述DRF为我们提供的三种分页方式.

全局配置

REST_FRAMEWORK = {
# 对所有分页器生效,但优先级低
'PAGE_SIZE': 5, # 每页显示5条数据
}

@


我们先准备好用于测试分页的数据以及序列化类

.

数据表

from django.db import models

class Test(models.Model):
"""用于测试分页的数据表"""
name = models.CharField(max_length=64)

生成表记录:

# 在Python脚本中调用Django环境
import os if __name__ == '__main__':
# 将下面的'blog095.settings'改为项目对应的名称后直接执行即可生成记录
os.environ.setdefault('DJANGO_SETTINGS_MODULE', > 'blog095.settings')
import django
django.setup()
from blog.models import Test # 导入数据表
[Test.objects.create(name="花千骨%s" % str(i)) for i in range(100)]

如果不理解此操作,可见文献【在Python脚本中调用Django环境】

·

序列化类

from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表 class TestSerializer(ModelSerializer):
"""用于测试分页的序列化类"""
class Meta:
model = Test
fields = '__all__'

第一种 PageNumberPagination 查第n页,每页显示n条数据

第一步 分页器配置文件

from rest_framework import pagination

class PageNumberPagination(pagination.PageNumberPagination):
"""查第n页,每页显示n条数据"""
page_size = 10 # 指定每页显示多少条数据
page_size_query_param = 'size' # URL参数中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 每页最多显示多少条数据

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog import pagination # 导入上面的分页配置 class Test01View(APIView):
def get(self, request):
queryset = Test.objects.all() # 1. 实例化分页器对象
page_obj = pagination.PageNumberPagination() # 2. 使用自己配置的分页器调用分页方法进行分页
page_data = page_obj.paginate_queryset(queryset, request) # 3. 序列化我们分页好的数据
ser_obj = TestSerializer(page_data, many=True) # # 4. 返回数据
# return Response(ser_obj.data) # 4. 返回带上一页/下一页连接的页面
return page_obj.get_paginated_response(ser_obj.data)

第三步 访问测试



如上图,指定page=10&size=5后,返回了相应的数据.


第二种 LimitOffsetPagination 在第n个位置,向后查n条数据

第一步 分页器配置文件

from rest_framework import pagination

class LimitOffsetPagination(pagination.LimitOffsetPagination):
"""在第n个位置,向后查n条数据"""
default_limit = 1 # 指定默认查多少条数据
limit_query_param = 'limit' # URL中指定查多少条数据的参数
offset_query_param = 'offset' # URL中指定从第几条数据开始查的参数
max_limit = 999 # 最大显示多少条数据

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog.pagination import LimitOffsetPagination # 导入上面的分页配置 class Test02View(APIView):
def get(self, request):
queryset = Test.objects.all() # 1. 实例化分页器对象
page_obj = LimitOffsetPagination() # 2. 使用自己配置的分页器调用分页方法进行分页
page_data = page_obj.paginate_queryset(queryset, request) # 3. 序列化我们分页好的数据
ser_obj = TestSerializer(page_data, many=True) # # 4. 返回数据
# return Response(ser_obj.data) # 4. 返回带上一页/下一页连接的页面
return page_obj.get_paginated_response(ser_obj.data)

第三步 访问测试


第三种 CursorPagination 加密游标的分页

第一步 分页器配置文件

from rest_framework import pagination

class CursorPagination(pagination.CursorPagination):
"""加密游标的分页"""
cursor_query_param = 'cursor' # 游标(这是加密的游标)
# ordering = '-id' # 从后往前取数据
ordering = 'id'
page_size = 1 # 每页显示的条数

第二步 视图文件

from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.serializers import ModelSerializer
from blog.models import Test # 导入数据表
from blog.pagination import CursorPagination # 导入上面的分页配置 class Test03View(APIView):
def get(self, request):
queryset = Test.objects.all() # 1. 实例化分页器对象
page_obj = CursorPagination() # 2. 使用自己配置的分页器调用分页方法进行分页
page_data = page_obj.paginate_queryset(queryset, request) # 3. 序列化我们分页好的数据
ser_obj = TestSerializer(page_data, many=True) # # 4. 返回数据
# return Response(ser_obj.data) # 4. 返回带上一页/下一页连接的页面
return page_obj.get_paginated_response(ser_obj.data)

好了,打开浏览器去测试吧.

还可以使用DRF视图系统生成带有上一页/下一页按钮的页面.

from rest_framework.viewsets import ModelViewSet

class Test04View(ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
pagination_class = CursorPagination # 指定分页配置器

如下图:



is ok.



【DRF分页】的更多相关文章

  1. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  2. drf 分页,获取fk,choise,m2m等字段数据(序列化)

    1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...

  3. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  4. DRF 分页组件

    Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...

  5. DRF分页组件

    为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...

  6. drf分页组件补充

    drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  7. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

  8. drf 分页

    分页: 1.简单的分页: 每页显示条数: page_size = api_settings.PAGE_SIZE 查询的页码数: page_query_param = "page" ...

  9. DRF分页

    一.序列化 from rest_framework impost serializers from . models import * class GoodsSerializer(serializer ...

随机推荐

  1. 常见bug分析

    变量类型不匹配,形参和实参类型不匹配,隐式类型转换,变量类型赋值不匹配, 工具不熟悉,导致逻辑错误,查看代码,测试驱动开发,完整的测试用例,覆盖所有分支, 变量超出范围,对于大的数据要特别注意, 工具 ...

  2. django-debug-toolbar 使用

    https://pypi.org/project/django-debug-toolbar/ https://django-debug-toolbar.readthedocs.io/en/latest ...

  3. python 进阶:修饰器的介绍

    参考链接:Python 函数装饰器 我认为python中的装饰器是一个很厉害的功能,他能瞬间提升代码的逼格,但对于我这样的小白来说,别说为所欲为的使用了,就连简单的尝试一下,却也是难于登天.经过长达半 ...

  4. C# Expression 树转化为SQL与语句(二)--解决参数问题

    在用Expression解析的的时候碰到一些参数(不是具体的值),会出现这种情况. 在这里我们希望得到的是id=10,而不是id=m_id;那如何来解析这些参数? ================== ...

  5. 洛谷 P3068 [USACO13JAN]派对邀请函Party Invitations

    P3068 [USACO13JAN]派对邀请函Party Invitations 题目描述 Farmer John is throwing a party and wants to invite so ...

  6. django-xadmin定制之列表页searchbar placeholder

    环境:xadmin-for-python3 python3.5.2 django1.9.12 列表页的searchbar如果提供的可搜索字段,都没提示哪个字段可搜索,很不友好,本次定制主要增加inpu ...

  7. Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上)

    继上一篇Android系统源代码剖析(一)---Settings 接着来介绍一下设置中某个模块的源代码.本文依然是基于Android4.42源代码进行分析,分析一下蓝牙模块的实现.建议大致看一下关于S ...

  8. Mesh BRep Shapes

    Mesh BRep Shapes eryar@163.com Abstract. 当对OpenCASCADE的BRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖 ...

  9. 【Android实战】Socket消息通信

    这篇博客的内容是基于http://my.oschina.net/fengcunhan/blog/178155进行改造的.所以须要先看完这篇博客,然后再来看以下的内容. 1.须要完毕的功能是直播间的so ...

  10. Introduction to IIS Architectures

    https://docs.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architectur ...