DRF 返回数据的封装,和分页


1 返回值的 封装

自定义一个类,初始化基本的返回数据信息

class BaseResponse(object):
"""
初始化基本的返回数据信息
"""
def __init__(self,status=True,data=None,error=None):
self.status = status
self.data = data
self.error = error @property
def get_data(self):
return self.__dict__

视图

class IndexView(APIView):
def get(self,request,version):
ret = BaseResponse() # 获取初始的数据信息
try:
user_list = UserInfo.objects.all()
ser = IndexSerializer(user_list,many=True)
ret.data=ser.data
except Exception as e:
ret.status = False
ret.error = '错误'
return Response(ret.get_data)

2 分页的实现

数据量大的时候,如何实现分页

a. 记录 当前访问页面的数据id  --- 数据id
b. 不显示全部页面 只显示一部分页面
c. 只显示上一页 下一页 (url 中的页码进行加密)

mysql 解决分页查询的优化方法

分页是 limit + offset 实现

  offset定位,limit取数据,会扫描之前所有的数据,这样越往后,数据量就会越大,查询的速度也会越来越慢

解决方法 -- 利用id索引覆盖

    id字段是主键,自然包含默认的主键索引。

    利用覆盖索引,只包含id列:
select id from product limit 866613, 20 0.2秒
select * from product limit 866613, 20 37.44秒
这样提升了大概100多倍的速度

使用:

记录起始 id,查询条件ID >

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

(1) 基于 limit 和 offset 实现

   /api/v2/index/?limit=1&offset=2

LimitOffsetPagination:

class MyPagination(LimitOffsetPagination):
max_limit = 1
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset' class IndexView(APIView):
def get(self,request,version):
ret = BaseResponse() # 获取初始的数据信息
p = MyPagination()
try:
user_list = UserInfo.objects.all()
page_user_list = p.paginate_queryset(queryset=user_list,request=request,view=self)
ser = IndexSerializer(instance=page_user_list,many=True)
ret.data = ser.data
ret.next = p.get_next_link() # 添加 下一页的url
ret.prev = p.get_previous_link() # 添加 上一页的url
except Exception as e:
ret.status = False
ret.error = '错误'
return Response(ret.get_data)

Response,get _ paginated _ response两种返回值的区别

return p.get_paginated_response(ser.data) -- 带有上一页和下一页 的返回值

(2) 基于 pageNum 实现 分页

/api/v2/index/?page=1&size=3

PageNumberPagination

    class MyPagination2(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 2

(3) 基于 cursor 页码加密 实现

http://127.0.0.1:8000/api/v2/index/?cursor=cD0y&size=2

CursorPagination

class MyPagination3(CursorPagination):
cursor_query_param = 'cursor'
ordering = 'id'
page_size = 2
max_page_size = 2
page_size_query_param = 'size'

DRF 返回数据的封装,和分页的更多相关文章

  1. 在论坛中出现的比较难的sql问题:5(row_number函数 分页、随机返回数据)

    原文:在论坛中出现的比较难的sql问题:5(row_number函数 分页.随机返回数据) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 1.在inner join后, ...

  2. 基于EasyExcel实现的分页数据下载封装

    功能概述 主要实现的功能: 1.分页查询,避免一次性查询全部数据加载到内存引起频繁FULL GC甚至OOM 2.当数据量超过单个工作簿最大行数(1048575)时,自动将数据写入新的工作簿 3.支持百 ...

  3. 12 Flutter仿京东商城项目 商品列表页面请求数据、封装Loading Widget、上拉分页加载更多

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  4. Java封装接口统一返回数据模板

    现在大多数都使用前后端分离开发模式,前端通过Ajax请求访问后台服务器,后台返回JSON数据供前端操作,这里编写一个统一返回数据模板类,方便日后操作 public class R extends Ha ...

  5. 基于jQuery封装的分页组件

    前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...

  6. ASP.NET API(MVC) 对APP接口(Json格式)接收数据与返回数据的统一管理

    话不多说,直接进入主题. 需求:基于Http请求接收Json格式数据,返回Json格式的数据. 整理:对接收的数据与返回数据进行统一的封装整理,方便处理接收与返回数据,并对数据进行验证,通过C#的特性 ...

  7. mysql数据库千万级别数据的查询优化和分页测试

    原文地址:原创 mysql数据库千万级别数据的查询优化和分页测试作者:于堡舰 本文为本人最近利用几个小时才分析总结出的原创文章,希望大家转载,但是要注明出处 http://blog.sina.com. ...

  8. uinty3d使用ugui封装一个分页控件

    我们在显示数据时有的数据比较多,手机内存有限,我们不可能分配很多的控件来显示这些数据,分页是一个不错的选择.比如玩家交易行.我们现在封装一个自己简单的分页控件来显示玩家交易行. 分页控件的原理其实很简 ...

  9. 接口返回数据Json格式处理

    有这样一个页面 , 用来显示用户的账户记录数据,并且需要显示每个月的 收入 支出合计 ,在分页的时候涉及到一些问题,需要对返回的Json格式做处理,处理起来比较麻烦,后端返回的Json数据格式形式如下 ...

随机推荐

  1. master: Error: JAVA_HOME is not set and could not be found.问题解决

  2. springboot-vue项目后台2---pojo对查询结果手动分组

    <resultMap id="PResult" type="packs" > <result column="device_type ...

  3. jenkins添加GIT repository报错

    添加了ssh互信,但一直提示如下错误. Failed to connect to repository : Command "git ls-remote -h git@git.xxx.cn: ...

  4. c刷新缓冲区

    int c; while((c = getchar()) != '\n' && c != EOF);

  5. 20145201《Java程序设计》第五次实验报告

    实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 我负责客户端 组队队员:鄢曼君20145227负责服务器 博客地址:htt ...

  6. MapReduce:给出children-parents(孩子——父母)表,要求输出grandchild-grandparent(孙子——爷奶)表

    hadoop中使用MapReduce单表关联案例: MapReduce:给出children-parents(孩子——父母)表,要求输出grandchild-grandparent(孙子——爷奶)表. ...

  7. Linux 一键安装最新内核并开启 BBR 脚本

    原文链接   https://teddysun.com/489.html 请到原文链接仔细阅读后操作.建议查看过脚本内容后操作,方便理解运行过程. 使用root用户登录,运行以下命令: wget -- ...

  8. oracle 10g和11g将表到缓存到内存中

    alter table 表名 cache;alter table 表名 storage(buffer_pool keep);

  9. springBean的作用域

    Bean的作用域有五个类别 1.singleton,不写的话默认也是这个,这个的意思就是,单例的,就是说,不管你new多少次,都是一个对象 2.prototype,就是说每次new一个bean都是一个 ...

  10. lua笔记之userdata

    1.一直使用框架里封装好的c库,想着自己一点一点的写些例子,学习下,以后需要c库,可以自己写了. 下边是一个简单的userdata的例子--数组操作. newarray.c #include &quo ...