python測試開發django-rest-framework-86.分頁查詢功能(PageNumberPagination)


前言

當查詢出來的數據量非常大的時候,需要分頁查詢,django-rest-framework 提供了分頁的支持。
有三種分頁功能:PageNumberPagination,LimitOffsetPagination,CursorPagination。

分頁器

django-rest-framework 分頁器有三種:

  • PageNumberPagination 簡單分頁(查看第n頁,每頁顯示N條)
  • LimitOffsetPagination 偏移分頁(在第n個位置,向后查看n條數據)
  • CursorPagination 加密分頁,只能看上一頁和下一頁,速度快

簡單分頁(PageNumberPagination)

我們可以在配置文件中設置全局的分頁方式, 這里設置簡單分頁(PageNumberPagination),每頁顯示10條數據

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 5  # 每頁數目
}

也可以自己重寫PageNumberPagination類,定義分頁方式

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


class MyPageNumberPagination(PageNumberPagination):
    page_size = 5                    # 默認每頁顯示的多少條記錄
    page_query_param = 'page'        # 默認查詢參數名為 page
    page_size_query_param = 'size'   # 前台控制每頁顯示的最大條數
    max_page_size = 20              # 后台控制顯示的最大記錄條數

PageNumberPagination類可以設置以下屬性

  • page_size 數字,頁面顯示的記錄條數,不設置的就默認setting配置的全局PAGE_SIZE值
  • page_query_param 字符串,查詢參數的名稱,不設置默認是'page'
  • page_size_query_param 字符串,請求設置頁面大小的參數名稱,默認是None
  • max_page_size 最大允許請求的頁面大小,僅在page_size_query_param被設置時有效
  • last_page_string 字符串列表或元組,默認是 ('last',)
  • template 分頁空間使用的模板名稱,可以覆蓋或設置為None,默認'rest_framework/pagination/numbers.html'

APIView使用分頁查詢

寫查詢視圖的時候,先序列化,再定義分頁器,查詢的時候可以帶上參數/api/v1/goods?page=1&size=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__'  # 返回全部的字段

# 定義分頁器簡單分頁(PageNumberPagination)
class MyPageNumberPagination(PageNumberPagination):
    page_size = 5                    # 默認每頁顯示的多少條記錄
    page_query_param = 'page'        # 默認查詢參數名為 page
    page_size_query_param = 'size'   # 前台控制每頁顯示的最大條數
    max_page_size = 20               # 后台控制顯示的最大記錄條數


# 查詢視圖
class GoodsAPISView(APIView):
    permission_classes = (AllowAny,)      # AllowAny 允許所有用戶


    def get(self, request, *args, **kwargs):
        '''返回所有的'''
        page = MyPageNumberPagination()
        goods = Goods.objects.all()   # 查詢全部
        ret = page.paginate_queryset(goods, request)
        serializer = GoodsAPISerializer2(ret, many=True)

        return Response({
            "code": 0,
            "msg": "success!",
            "data": serializer.data
        })

分頁查詢

如果不帶參數,直接請求,會返回默認的 5 條數據http://localhost:8000/api/v1/goods

{
	"code": 0,
	"msg": "success!",
	"data": [{
		"id": 1,
		"create_time": "2021-01-17 15:14:25",
		"update_time": "2021-01-19 10:02:05",
		"goodsname": "《selenium入門到精通3》",
		"goodscode": "sp_100049",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 52.365,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 13,
		"create_time": "2021-01-16 20:12:36",
		"update_time": "2021-01-17 09:41:05",
		"goodsname": "《selenium入門到精通》",
		"goodscode": "sp_100008",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 49.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 14,
		"create_time": "2021-01-16 20:12:42",
		"update_time": "2021-01-17 09:41:05",
		"goodsname": "《selenium入門到精通》",
		"goodscode": "sp_100009",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 49.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 101,
		"create_time": "2021-01-16 21:24:10",
		"update_time": "2021-01-17 09:41:05",
		"goodsname": "",
		"goodscode": "sp_10086",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 0.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 102,
		"create_time": "2021-01-16 21:26:23",
		"update_time": "2021-01-17 09:41:05",
		"goodsname": "",
		"goodscode": "sp_10087",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 0.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}]
}

帶上 page 和 size 參數查詢,指定查詢的 page 頁數和 size 數量http://localhost:8000/api/v1/goods?page=1&size=2

{
	"code": 0,
	"msg": "success!",
	"data": [{
		"id": 1,
		"create_time": "2021-01-17 15:14:25",
		"update_time": "2021-01-19 10:02:05",
		"goodsname": "《selenium入門到精通3》",
		"goodscode": "sp_100049",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 52.365,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 13,
		"create_time": "2021-01-16 20:12:36",
		"update_time": "2021-01-17 09:41:05",
		"goodsname": "《selenium入門到精通》",
		"goodscode": "sp_100008",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 49.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}]
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM