DRF分頁器(Django Restful Framework)

資料推薦

官方文檔
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/pagination_zh/
B站沒有好的教學視頻,不建議看,直接看官方文檔吧。

PageNumberPagination

此分頁樣式接受請求查詢參數中的單個數字頁碼。
Request:

GET https://api.example.org/accounts/?page=4

Response:

{"count": 1023"next": "https://api.example.org/accounts/?page=5","previous": "https://api.example.org/accounts/?page=3","results": […]
}

Settings:

全局設置

全局啟用 PageNumberPagination 樣式,請使用以下配置,并根據需要設置 PAGE_SIZE

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 100
}

單視圖設置(重點!)

自定義繼承子類

自定義一個繼承自PageNumberPagination的分頁器,然后在里面設置page_size,如下:

class LargeResultsSetPagination(PageNumberPagination):page_size = 1000page_size_query_param = 'page_size' # 非必需max_page_size = 10000 # 非必需

重寫get_paginate_by方法

如果只想用PageNumberPagination本身,那么需要通過重寫get_paginate_by方法來設置page_size。

class YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializer# 使用官方的 PageNumberPagination 類pagination_class = PageNumberPagination# 覆蓋默認的分頁設置def get_paginate_by(self, queryset):return self.request.query_params.get('page_size', 5)

LimitOffsetPagination

這種分頁樣式反映了查找多個數據庫記錄時使用的語法。客戶端包括“limit”和“offset”查詢參數。limit指示要返回的項目的最大數目,這相當于其他樣式中的 page_size。offset指示查詢相對于完整的未分頁項的起始位置。
Request:

GET https://api.example.org/accounts/?limit=100&offset=400

Response:

HTTP 200 OK
{"count": 1023"next": "https://api.example.org/accounts/?limit=100&offset=500","previous": "https://api.example.org/accounts/?limit=100&offset=300","results": […]
}

Settings:

全局設置

為了全局啟用 LimitOffsetPagination樣式,請使用以下配置:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 10
}

ps:又是一個易錯點,雖然limitoffsetpagination用的是limit,但是全局設置時還是要設置PAGE_SIZE。。

單視圖設置(重點!)

自定義繼承子類實現

自定義一個繼承自LimitOffsetPagination的分頁器,然后在里面設置limit,如下:

class CustomLimitOffsetPagination(LimitOffsetPagination):default_limit = 5  # 自定義默認每頁顯示的數量,一定要給max_limit = 20  # 自定義每頁顯示的最大數量,非必需

重寫get_paginate_by

如果只想用LimitOffsetPagination本身,那么需要通過重寫get_paginate_by方法來設置limit。

from rest_framework import generics
from rest_framework.pagination import LimitOffsetPaginationclass YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializerpagination_class = LimitOffsetPagination  # 使用 LimitOffsetPagination# 覆蓋默認的分頁設置def get_paginate_by(self, queryset):return self.request.query_params.get('limit', 10)

獲取分頁輸出樣式/具體如何使用分頁器(重點!)

像是如上的

{"count": 1023"next": "https://api.example.org/accounts/?page=5","previous": "https://api.example.org/accounts/?page=3","results": […]
}
{"count": 1023"next": "https://api.example.org/accounts/?limit=100&offset=500","previous": "https://api.example.org/accounts/?limit=100&offset=300","results": […]
}

都是pagenumberpagination、limitoffsetpagination等官方分頁器通過get_paginated_response返回的默認的分頁樣式。

具體使用如下:

class CustomLimitOffsetPagination(LimitOffsetPagination):default_limit = 5  # 自定義默認每頁顯示的數量class YourView(generics.ListAPIView):queryset = YourModel.objects.all()serializer_class = YourSerializerpagination_class = CustomLimitOffsetPagination  # 使用自定義分頁類def get(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())page = self.paginate_queryset(queryset)  # 對查詢集進行分頁if page is not None:serializer = self.get_serializer(page, many=True)return self.get_paginated_response(serializer.data)  # 獲取分頁樣式的響應serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

自定義分頁輸出樣式(重寫get_paginated_response方法!!重要!)

假設我們想用一個修改過的格式替換默認的分頁輸出樣式,該格式在嵌套的“links”鍵中包含下一頁和上一頁的鏈接。我們就需要自定義分頁器,并重寫get_paginated_response方法

class CustomPagination(pagination.PageNumberPagination):def get_paginated_response(self, data):return Response({'links': {'next': self.get_next_link(),'previous': self.get_previous_link()},'count': self.page.paginator.count,'results': data})

最常使用場景舉例

from rest_framework.pagination import LimitOffsetPaginationfrom utils import ThirdPartResponseclass TaskPagination(LimitOffsetPagination):default_limit = 5  # 自定義默認每頁顯示的數量,一定要給。及時后續會在請求參數中拿到limit,也一定要給def get_paginated_response(self, data):return ThirdPartResponse(data={"total": self.count, "data": data})@action(detail=False, methods=["get"], url_path="list-by-template/(?P<template_id>.+)")
def list_by_template(self, request, template_id=None):"""根據template_id過濾任務列表"""if template_id is None:message = "template_id is required"logger.error(message)return ThirdPartResponse(result=False, message=message)tasks = self.queryset.filter(template_id=template_id)paginator = TaskPagination()page = paginator.paginate_queryset(tasks, request)if page is not None:serializer = self.get_serializer(page, many=True)return paginator.get_paginated_response(serializer.data)serializer = self.get_serializer(tasks, many=True)return Response(serializer.data)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45800.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【14】Github Copilot環境搭建

環境搭建 這里以Visual Studio Code為例&#xff0c;安裝好vs code&#xff0c;打開擴展側邊菜單欄&#xff0c;搜索“Github Copilot”&#xff0c;會出現如下圖的兩個插件&#xff0c;點擊安裝第一個&#xff0c;另一個會附帶一起安裝&#xff0c;然后彈出提示重新啟動vs co…

對于棧和鏈表,數組之間關系的一些探索

先貼臉來個圖 這是一個解析圖&#xff0c;總體是個棧&#xff08;stacks&#xff09;細分有數組和鏈表【注意這兒的linkedlist可不是Java集合List中的linklist】 對于棧&#xff0c;如果我們想向棧中添加元素&#xff0c;或者想從中刪除元素&#xff0c;都必須從一個地方開始&…

阿里云DSW實例中安裝并運行Neo4J

想嘗試使用大模型對接Neo4J&#xff0c;在阿里云DSW實例中安裝了Neo4J&#xff0c;卻無法通過本地瀏覽器訪問在DSW實例中運行的Neo4J。嘗試了改neo4j.conf文件&#xff0c;以及添加專用網絡的公共IP地址等方法&#xff0c;均沒有成功。最后決定直接在服務器的命令行進行各種Cyp…

uniapp 頁面字體亂碼問題解決【已解決】

這個不是我們本身代碼的問題&#xff0c;調整一下編譯器就好了 打開編譯器文件 2,然后以指定編碼重新打開&#xff0c;選擇utf-8就行了 非常簡單 &#xff0c;如果你選擇了之后重新渲染頁面還是亂碼的話&#xff0c;你就把項目關掉&#xff0c;重新啟動就OK了。。。

從零開始學習嵌入式----結構體struct和union習題回顧

一、通過結構體和自定義函數實現成績從大到小的排序&#xff0c;要求在主函數內定義結構體數組。 #include <stdio.h> //定義一個結構體類型 typedef struct Student {int age;char name[32];float score; } STU; //定義一個函數實現成績從小到大的排序 void fun(STU *p…

基于搜索二叉樹的停車收費管理系統

系統效果&#xff1a;錄入汽車信息 查看汽車信息 收費信息查看 查詢車庫車輛 代碼展示&#xff1a; //SearchBinaryTree.h #pragma once #include<iostream> #include<string> #include<time.h> #include<Windows.h> using namespace std;template<…

百分點科技入選《2024中國數據要素產業圖譜1.0版》

近日&#xff0c;數據猿與上海大數據聯盟發布了《2024中國數據要素產業圖譜1.0版》&#xff0c;百分點科技憑借領先的數據科學技術和深入的行業洞察力&#xff0c;入選數據管理/治理、數據分析與挖掘、應急管理三大領域。 在數據要素的發展關鍵期&#xff0c;數據作為生產要素持…

Hadoop中的YARN組件

文章目錄 YARN 的主要功能YARN 的架構YARN 的工作流程YARN 的優勢總結 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 生態系統中的一個關鍵組件&#xff0c;負責資源管理和作業調度。它是 Hadoop 2.x 及更高版本中的核心模塊&#xff0c;旨在提高集群…

【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【26】【內網穿透】cpolar

持續學習&持續更新中… 守破離 【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【27】【內網穿透】cpolar 內網穿透cpolar內網穿透聯調配置練習—使用公網地址訪問gulimall.com參考 內網穿透 正常的外網需要訪問我們項目的流程是&#xff1a; 買服務器并且有公網固定…

怎么壓縮視頻文件?簡單的壓縮視頻方法分享

視頻已成為我們日常生活中不可或缺的一部分。但隨著視頻質量的提高&#xff0c;文件大小也逐漸成為我們分享的阻礙。如何有效壓縮視頻文件&#xff0c;使其既能保持清晰&#xff0c;又能輕松分享&#xff1f;今天&#xff0c;給大家分享五種實用的視頻壓縮方法&#xff0c;快來…

簡談設計模式之適配器模式

適配器模式是結構型設計模式之一, 用于將一個類的接口轉換成客戶期望的另一個接口. 通過使用適配器模式, 原本由于接口不兼容而無法一起工作的類可以協同工作 適配器模式通常有兩種實現方式 類適配器模式 (Class Adapter Pattern&#xff09;: 使用繼承來實現適配器。**對象適…

安裝adb和常用命令

下載ADB安裝包 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解壓安裝包 解壓如上下載的安裝包&#xff0c;然后復制adb.exe所在的文件地址 配置環境變量 我的電腦——>右鍵屬性——>高級系統設置——>環境變量——>系統變量—…

stm32學習:(寄存器1)控制寄存器來讓led亮

開啟時鐘&#xff0c;先查找到開啟時鐘的寄存器&#xff0c;然后通過該寄存器操作時鐘的開啟或關閉&#xff0c;要打開的是GPIOA的時鐘 在芯片手冊&#xff0c;找到RCC寄存器描述章節找到APB2外設時鐘使能寄存器&#xff08;RCC_APB2ENR)&#xff0c;現在算RCC_APB2ENR這個寄存…

基于mcu固件反匯編逆向入門示例-stm32c8t6平臺

基于mcu固件反匯編逆向入門示例-stm32c8t6平臺 本文目標&#xff1a;基于mcu固件反匯編逆向入門示例-stm32c8t6平臺 按照本文的描述&#xff0c;應該可以在對應的硬件上通實驗并舉一反三。 先決條件&#xff1a;擁有C語言基礎&#xff0c;集成的開發環境&#xff0c;比如&am…

ES6及ESNext規范

1、let 和 const 而let引入了塊級作用域的概念, 創建setTimeout函數時&#xff0c;變量i在作用域內。對于循環的每個迭代&#xff0c;引用的i是i的不同實例。 暫時性死區&#xff1a;不允許變量提升 const就很簡單了, 在let的基礎上, 不可被修改 js 代碼解讀 for(var i0;i<…

《背包亂斗》為什么好玩 蘋果電腦怎么玩《背包亂斗》游戲 mac怎么玩steam windows游戲

在當今競爭激烈的游戲市場中&#xff0c;《背包亂斗》以其獨特的魅力在眾多作品中脫穎而出&#xff0c;吸引了大量玩家的關注和喜愛。其創新的游戲機制和不斷迭代的內容&#xff0c;加之出色的視覺效果和社區建設&#xff0c;使其成為了游戲界的一股清流。 一、《背包亂斗》為…

Hadoop學習記錄一

HDFS&#xff08;Hadoop Distributed File System&#xff09;是Hadoop項目的一部分&#xff0c;用于存儲海量數據。HDFS設計為可以在廉價硬件上運行&#xff0c;同時提供高容錯性。HDFS主要由三個關鍵角色組成&#xff1a;NameNode、DataNode和SecondaryNameNode。下面我用大白…

《絕區零》是一款什么類型的游戲,Mac電腦怎么玩《絕區零》蘋果電腦玩游戲怎么樣

米哈游的《絕區零》最近在網上爆火呀&#xff0c;不過很多人都想知道mac電腦能不能玩《絕區零》&#xff0c;今天麥麥就給大家介紹一下《絕區零》是一款什么樣的游戲&#xff0c;Mac電腦怎么玩《絕區零》。 一、《絕區零》是一款什么樣的游戲 《絕區零》是由上海米哈游自主研發…

Web前端-Web開發HTML基礎1-input

一. 基礎 1. 寫一個輸入框代碼&#xff0c;類型為密碼&#xff1b; 2. 寫一個輸入框代碼&#xff0c;類型為密碼&#xff1b; 3. 寫一個輸入框代碼&#xff0c;類型為密碼&#xff0c;名稱為"password"&#xff1b; 4. 寫一個輸入框代碼&#xff0c;類型為密碼&#…

ES快速開發,ElasticsearchRestTemplate基本使用以及ELK快速部署

最近博主有一些elasticsearch的工作&#xff0c;所以更新的慢了些&#xff0c;現在就教大家快速入門&#xff0c;并對一些基本的查詢、更新需求做一下示例&#xff0c;廢話不多說開始&#xff1a; 1. ES快速上手 es下載&#xff1a;[https://elasticsearch.cn/download/]()這…