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. 4 TensorFlow入门之dropout解决overfitting问题

    ------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...

  2. curl: (60) SSL certificate problem: unable to get local issuer certificate

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  3. vscode 编写c++

    参考了 配置文件之前的操作:https://www.cnblogs.com/lianshuiwuyi/p/8094388.html 配置文件具体内容:https://blog.csdn.net/qq5 ...

  4. 使用sqoop把mysql数据导入hive

    使用sqoop把mysql数据导入hive export HADOOP_COMMON_HOME=/hadoop export HADOOP_MAPRED_HOME=/hadoop   cp /hive ...

  5. Linux Shell编程 exit、break、continue

    exit语句 在系统中exit 命令用于退出当前用户的登录状态.在 Shell 脚本中exit 语句是用来退出当前脚本. exit 的语法如下: exit [返回值] 如果在 exit 之后定义了返回 ...

  6. DNS域名解析的配置

    /etc/resolv.conf它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序.该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的 ...

  7. Microservice 概念

    一天我司招财猫姐(HR 大人)问我,你给我解释一下 Microservice 是什么吧.故成此文.一切都是从一个创业公司开始的. 故事 最近的创业潮非常火爆,我禁不住诱惑也掺和了进去,创建了一家公司. ...

  8. sql临时表的优点

    1: 临时表来组织数据,更高效的查询速度. 2:临时表的操作不会写入日志文件:好处:提高了 临时表操作的速度:坏处: 数据一旦丢失,无法恢复. 3: 临时表只允许当前会话框进行访问,因此不会担心死锁 ...

  9. discuz对PHP7不支持mysql的兼容性处理

    PHP7 废除了 ”mysql.dll” ,推荐使用 mysqli 或者 pdo_mysql,discuz对原生mysql函数做了如下处理,通过mysqli代替原mysql函数 http://blog ...

  10. 无缝走A的终极技巧:学会了你也是走A怪

    ADC重点之中:改键铸造更强走A! 我们先来欣赏一波来自世界顶尖ADC大师兄Doublelift的教科书般的走A. 他使用的金克丝在空蓝的情况下,凭借娴熟的走A技巧,拿下五杀. 关于走A,其实它有着一 ...