首页 > 编程语言 > 详细

python测试开发django-rest-framework-87.分页查询之偏移分页(LimitOffsetPagination)和游标分页(CursorPagination)

时间:2021-01-19 19:48:21      阅读:58      评论:0      收藏:0      [点我收藏+]

前言

django-rest-framework 分页器提供了3中分页方式,前面一篇介绍了简单分页 (PageNumberPagination),
本篇继续介绍另外2个分页偏移分页 (LimitOffsetPagination) 和游标分页 (CursorPagination)

偏移分页 (LimitOffsetPagination)

LimitOffsetPagination 是偏移分页,查询的时候url地址带上 limit 和 offset 2个参数,如下格式

http://localhost:8000/api/v1/goods?limit=100&offset=10

可以重写 LimitOffsetPagination 类,定义查询的一些参数配置

  • default_limit = api_settings.PAGE_SIZE # 默认条数
  • limit_query_param = ‘limit‘ # 查询时,查询参数及指定查询多少条
  • offset_query_param = ‘offset‘ # 查询时,指定的起始位置是哪
  • max_limit = None # 查询时,最多返回多少条

先导入LimitOffsetPagination

# 分页器  -- 偏移分页
from rest_framework.pagination import LimitOffsetPagination

class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 5               # 设置每页显示的数量为5,那么查询结果默认返回5条
    limit_query_param = ‘limit‘     # 优先使用limit_query_param来设置显示条数
    offset_query_param = ‘offset‘   # 偏移数,查询时,指定的起始位置是哪
    max_limit = 20                  # 查询时,最多返回多少条

APIView使用分页查询

写查询视图的时候,先序列化,再定义分页器,查询的时候可以带上参数/api/v1/goods?limit=100&offset=10

from rest_framework import serializers
from .models import Goods
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated, AllowAny
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


# 序列化 Goods 模型
class GoodsAPISerializer(serializers.ModelSerializer):

    class Meta:
        model = Goods
        fields = ‘__all__‘  # 返回全部的字段

# 分页器  -- 偏移分页
class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 5               # 设置每页显示的数量为5,那么查询结果默认返回5条
    limit_query_param = ‘limit‘     # 优先使用limit_query_param来设置显示条数
    offset_query_param = ‘offset‘   # 偏移数,查询时,指定的起始位置是哪
    max_limit = 20                  # 查询时,最多返回多少条



# 查询视图
class GoodsAPISView(APIView):
    permission_classes = (AllowAny,)      # AllowAny 允许所有用户


    def get(self, request, *args, **kwargs):
        ‘‘‘返回所有的‘‘‘
        page = MyLimitOffsetPagination()
        goods = Goods.objects.all()   # 查询全部
        ret = page.paginate_queryset(goods, request)
        serializer = GoodsAPISerializer2(ret, many=True)
  
        return Response({
            "code": 0,
            "msg": "success!",
            "data": serializer.data
        })

如果我们访问http://localhost:8000/api/v1/goods?offset=10&limit=3那么就是从查询的结果里面第10条数据往后面取3条数据

{
	"code": 0,
	"msg": "success!",
	"data": [{
		"id": 109,
		"create_time": "2021-01-17 10:14:41",
		"update_time": "2021-01-17 10:14:41",
		"goodsname": "pytest入门到精",
		"goodscode": "sp_100010",
		"merchantid": "10001",
		"merchantname": "悠悠学堂",
		"goodsprice": 68.8,
		"stock": 10000,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 110,
		"create_time": "2021-01-17 10:15:44",
		"update_time": "2021-01-17 10:15:44",
		"goodsname": "pytest入门到精",
		"goodscode": "sp_100011",
		"merchantid": "10001",
		"merchantname": "悠悠学堂",
		"goodsprice": 68.8,
		"stock": 10000,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 111,
		"create_time": "2021-01-17 10:24:13",
		"update_time": "2021-01-17 10:24:13",
		"goodsname": "pytest入门到精",
		"goodscode": "sp_100012",
		"merchantid": "10001",
		"merchantname": "悠悠学堂",
		"goodsprice": 68.8,
		"stock": 10000,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}]
}

游标分页(CursorPagination)

游标分页(CursorPagination)的特点是速度快,但不能指定指定查询

定义CursorPagination查询的一些参数配置

  • cursor_query_param = ‘cursor‘ # 查询的时候,指定的查询方式,默认‘cursor‘
  • page_size = 3 # 每页显示的条数
  • page_size_query_param = ‘size‘ # 设置size查询参数,默认None
  • max_page_size = 20 # 最多显示条数
  • ordering = ‘pk‘ # 默认排序规则:按pk从小到大排序,-pk表示从大到小排序

先导入CursorPagination

# 分页器  -- 加密游标分页
from rest_framework.pagination import CursorPagination


class MyCursorPagination(CursorPagination):
    page_size = 5                   # 默认每页的条数
    page_size_query_param = ‘size‘  # 查询参数size
    max_page_size = 20              # 最大每页的条数
    ordering = ‘pk‘   # 默认排序规则:按pk从小到大排序,-pk表示从大到小排序

APIView使用加密游标分页

from rest_framework import serializers
from .models import Goods
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated, AllowAny
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/


# 序列化 Goods 模型
class GoodsAPISerializer(serializers.ModelSerializer):

    class Meta:
        model = Goods
        fields = ‘__all__‘  # 返回全部的字段

# 分页器  -- 加密游标分页
class MyCursorPagination(CursorPagination):
    page_size = 5                   # 默认每页的条数
    page_size_query_param = ‘size‘  # 查询参数size
    max_page_size = 20              # 最大每页的条数
    ordering = ‘pk‘   # 默认排序规则:按pk从小到大排序,-pk表示从大到小排序



# 查询视图
class GoodsAPISView(APIView):
    permission_classes = (AllowAny,)      # AllowAny 允许所有用户


    def get(self, request, *args, **kwargs):
        ‘‘‘返回所有的‘‘‘
        page = MyCursorPagination()
        goods = Goods.objects.all()   # 查询全部
        ret = page.paginate_queryset(goods, request)
        serializer = GoodsAPISerializer2(ret, many=True)
  
        return Response({
            "code": 0,
            "msg": "success!",
            "data": serializer.data
        })

采用默认排序访问,url链接:/api/v1/goods?cursor=加密串

python测试开发django-rest-framework-87.分页查询之偏移分页(LimitOffsetPagination)和游标分页(CursorPagination)

原文:https://www.cnblogs.com/yoyoketang/p/14298778.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!