【DRF分页】
我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来.
因为这样会给内存造成巨大的压力,很容易就会内存溢出,所以我们希望一点一点的取.
同样,展示的时候也是一样的,我们必定会对数据进行分页显示.
本文将详细讲述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分页】的更多相关文章
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- drf 分页,获取fk,choise,m2m等字段数据(序列化)
1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...
- Django DRF 分页
Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...
- DRF 分页组件
Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...
- DRF分页组件
为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...
- drf分页组件补充
drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...
- drf分页功能
什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...
- drf 分页
分页: 1.简单的分页: 每页显示条数: page_size = api_settings.PAGE_SIZE 查询的页码数: page_query_param = "page" ...
- DRF分页
一.序列化 from rest_framework impost serializers from . models import * class GoodsSerializer(serializer ...
随机推荐
- GoldenGate 1403错误解决方法
OGG oracle goldengate 1403错误解决方法 1. 错误描述WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, re ...
- bzoj1270 BeijingWc2008 雷涛的小猫 DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1270 比较水的一道dp f1[i]为高度为i的时候的最大值 f2[i]为当前高度在第i棵树 ...
- vue滚动行为
有人问道如何记录vue页面的滚动条位置,再次载入组件的时候页面滚动到记录的位置? 思路: 记录滚动条位置我们好记 我们要在组件销毁之前也就是页面跳转的时候 需要用到生命周期beforeDistory将 ...
- 03016_DBCP连接池
1.连接池概述 (1)用池来管理Connection,这样可以重复使用Connection: (2)有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象: ( ...
- hibernate session.save()和session.persist()的区别
save()需要返回一个Serialzable的实现类,因此执行这个方法时会马上插入到数据库 而persist()不会立即插入到数据库. "当我们封装一个长会话流程的时候,persist() ...
- 记录遇到的ios下的bugs[废弃]
请看又一次排版后的文章 新地址
- AES加密解密在JAVA和ANDROID下互通
<span style="font-family: Arial, Helvetica, sans-serif;">昨天外包安卓的那个人说AES的加解密结果不一样.于是百 ...
- BootstrapDialog模态框
5最近是比较烦直接使用Bootstrap里面的模态框,满屏都是模态框代码,看得心烦.然后想起以前使用的BootstrapDialog.show()的方式,挺简单好用的.然后就拿出来分享一下. 1.下载 ...
- Android 使用Retrofit获取JSON数据
在大家使用网络请求的时候,往往会出现一种情况:需要拿到服务器返回来的JSON字符串,而Retrofit会默认将Json解析,而又没有直接暴露出拿到Json字符串的方法: 今天测接口的时候,发现当数据正 ...
- JS实现PC端全兼容复制
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...