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. RS232串口通信

    RS232串口经常使用在PC机与FPGA通信中,用于两者之间的数据传输,因为UART协议简单.易实现,故经常使用. DB9接口只需要使用3根线,RXD(2).TXD(3)和GND(5),如下图所示.而 ...

  2. Spring 数据库连接池读取系统环境变量作为参数

    原来是写在一个properties文件里面,后来项目要部署的的确太多了,每次更改不太方便,就想把这些固定不变的信息写在当地的环境变量里面 原先是这样的:引用的所有信息在jdbc.properties ...

  3. Nothing is impossible

    题记: <你凭什么上北大>--贺舒婷.依稀记得这篇文章是我高二的时候在<青年文摘>读到的,从此她就成了我为之奋斗的动力.北大,也是我梦中的学府,虽然自己也曾刻苦过,但是还是没有 ...

  4. HDU1158:Employment Planning(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1158 这题又是看了题解,题意是一项工作需要n个月完成,雇佣一个人需要m1的钱,一个人的月工资为sa,辞退一 ...

  5. Php 删除数组后几个元素

    <?php /* * 文件分类: practice@helkbore * 删除数组后几个元素 年2月5日10:24:42 */ $arr1 = array('aa', 'b', 'c', 'dd ...

  6. python入门四:异常

    一.异常 异常就是在触发异常条件时(解释器或程序员)而采取相应的措施 c++中异常使用try, throw, catch等关键字,而python中使用try, raise, except等 二.标准异 ...

  7. 轮询、长轮询、长连接、socket连接、WebSocket

    轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源.(而每一次的 HTTP 请求和应答 ...

  8. redhat 6.8 配置yum源

    一般安装好redhat后,不能注册的话,不能使用系统自带的yum源.但是我们可以自己配置yum源来解决这一问题.下面介绍下redhat配置163yum源. 1. 检查是否安装yum包 rpm -qa ...

  9. IE开发人员工具手册

    The DOM Explorer tool (CTRL + 1) The The DOM Explorer tool shows the structure of your webpage as it ...

  10. JAVA实现IP地址解析

    转载至:http://blog.csdn.net/dragontang/article/details/4151660 http://www.iteye.com/topic/340548#