欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django REST Framework 分頁(Pagination)詳解

 更新時間:2020年11月30日 10:30:25   作者:大江狗  
這篇文章主要介紹了Django REST Framework 分頁(Pagination)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在前面的DRF系列教程中,我們以博客為例介紹了序列化器, 使用基于類的視圖APIView和ModelViewSet開發(fā)了針對文章資源進行增刪查改的完整API端點,并詳細(xì)對權(quán)限和認(rèn)證(含jwt認(rèn)證)進行了總結(jié)與演示。在本篇文章中我們將向你演示如何在Django REST Framework中使用分頁。

分頁

為什么要分頁? 當(dāng)你的數(shù)據(jù)庫數(shù)據(jù)量非常大時,如果一次將這些數(shù)據(jù)查詢出來, 必然加大了服務(wù)器內(nèi)存的負(fù)載,降低了系統(tǒng)的運行速度。一種更好的方式是將數(shù)據(jù)分段展示給用戶。如果用戶在展示的分段數(shù)據(jù)中沒有找到自己的內(nèi)容,可以通過指定頁碼或翻頁的方式查看更多數(shù)據(jù),直到找到自己想要的內(nèi)容為止。

Django REST Framework提供3種分頁類,接下來我們會分別進行演示。

  1. PageNumberPagination類:簡單分頁器。支持用戶按?page=3這種方式查詢,你可以通過page_size這個參數(shù)手動指定每頁展示給用戶數(shù)據(jù)的數(shù)量。它還支持用戶按?page=3&size=10這種更靈活的方式進行查詢,這樣用戶不僅可以選擇頁碼,還可以選擇每頁展示數(shù)據(jù)的數(shù)量。對于第二種情況,你通常還需要設(shè)置max_page_size這個參數(shù)限制每頁展示數(shù)據(jù)的最大數(shù)量,以防止用戶進行惡意查詢(比如size=10000), 這樣一頁展示1萬條數(shù)據(jù)將使分頁變得沒有意義。
  2. LimitOffsetPagination類:偏移分頁器。支持用戶按?limit=20&offset=100這種方式進行查詢。offset是查詢數(shù)據(jù)的起始點,limit是每頁展示數(shù)據(jù)的最大條數(shù),類似于page_size。當(dāng)你使用這個類時,你通常還需要設(shè)置max_limit這個參數(shù)來限制展示給用戶數(shù)據(jù)的最大數(shù)量。
  3. CursorPagination類:加密分頁器。這是DRF提供的加密分頁查詢,僅支持用戶按響應(yīng)提供的上一頁和下一頁鏈接進行分頁查詢,每頁的頁碼都是加密的。使用這種方式進行分頁需要你的模型有"created"這個字段,否則你要手動指定ordering排序才能進行使用。

使用PageNumberPagination類

DRF中使用默認(rèn)分頁類的最簡單方式就是在settings.py中進行全局配置,如下所示:

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

展示效果如下,每頁展示兩條記錄, 不支持用戶指定每頁展示數(shù)據(jù)的數(shù)量。

但是如果你希望用戶按?page=3&size=10這種更靈活的方式進行查詢,你就要進行個性化定制。在實際開發(fā)過程中,定制比使用默認(rèn)的分頁類更常見,具體做法如下。

第一步: 在app目錄下新建pagination.py, 添加如下代碼:

#blog/pagination.py

from rest_framework.pagination import PageNumberPagination
 
 
class MyPageNumberPagination(PageNumberPagination):
 page_size = 2 # default page size
 page_size_query_param = 'size' # ?page=xx&size=??
 max_page_size = 10 # max page size

我們自定義了一個MyPageNumberPagination類,該類繼承了PageNumberPagination類。我們通過page_size設(shè)置了每頁默認(rèn)展示數(shù)據(jù)的條數(shù),通過page_size_query_param設(shè)置了每頁size的參數(shù)名以及通過max_page_size設(shè)置了每個可以展示的最大數(shù)據(jù)條數(shù)。

第二步:使用自定義的分頁類

在基于類的視圖中,你可以使用pagination_class這個屬性使用自定義的分頁類,如下所示:

from rest_framework import viewsets
from .pagination import MyPageNumberPagination
 
 
 
 
class ArticleViewSet(viewsets.ModelViewSet):
 # 用一個視圖集替代ArticleList和ArticleDetail兩個視圖
 queryset = Article.objects.all()
 serializer_class = ArticleSerializer
 pagination_class = MyPageNumberPagination
 
 
 
 
 # 自行添加,將request.user與author綁定
 def perform_create(self, serializer):
  serializer.save(author=self.request.user)
 
 
 # 自行添加,將request.user與author綁定
 def perform_update(self, serializer):
  serializer.save(author=self.request.user)

展示效果如下所示:

當(dāng)然定制分頁類不限于指定page_size和max_page_size這些屬性,你還可以改變響應(yīng)數(shù)據(jù)的輸出格式。比如我們這里希望把next和previous放在一個名為links的key里,我們可以修改MyPageNumberPagination類,重寫get_paginated_response方法:

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
 
 
 
 
class MyPageNumberPagination(PageNumberPagination):
 page_size = 2 # default page size
 page_size_query_param = 'size' # ?page=xx&size=??
 max_page_size = 10 # max page size
 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
  })

新的展示效果如下所示:

注意:重寫get_paginated_response方法非常有用,你還可以給分頁響應(yīng)數(shù)據(jù)傳遞額外的內(nèi)容,比如code狀態(tài)碼等等。

前面的例子中我們只在單個基于類的視圖或視圖集中使用到了分頁類,你還可以修改settings.py全局使用你自定義的分頁類,如下所示。展示效果是一樣的,我們就不詳細(xì)演示了。

REST_FRAMEWORK = {
 'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyPageNumberPagination',
}

使用LimitOffsetPagination類

使用這個分頁類最簡單的方式就是在settings.py中進行全局配置,如下所示:

REST_FRAMEWORK = {
 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'
}

展示效果如下所示,從第6條數(shù)據(jù)查起,每頁展示2條。

你也可以自定義MyLimitOffsetPagination類,在單個視圖或視圖集中使用,或者全局使用。

from rest_framework.pagination import LimitOffsetPagination
 
 
class MyLimitOffsetPagination(LimitOffsetPagination):
 default_limit = 5 # default limit per age
 limit_query_param = 'limit' # default is limit
 offset_query_param = 'offset' # default param is offset
 max_limit = 10 # max limit per age

使用CursorPagination類

全局使用

REST_FRAMEWORK = {
 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
 'PAGE_SIZE': 2
}

展示效果如下所示:

什么? 為什么會出錯誤? 使用CursorPagination類需要你的模型里有created這個字段,否則你需要手動指定ordering字段。這是因為CursorPagination類只能對排過序的查詢集進行分頁展示。我們的Article模型只有create_date字段,沒有created這個字段,所以會報錯。

為了解決這個問題,我們需要自定義一個MyCursorPagination類,手動指定按create_date排序, 如下所示:

#blog/pagination.py

from rest_framework.pagination import CursorPagination
 
 
class MyArticleCursorPagination(CursorPagination):
 page_size = 3 # Default number of records per age
 page_size_query_param = 'page_size' 
 cursor_query_param = 'cursor' # Default is cursor
 ordering = '-create_date'

修改settings.py, 使用自己定義的分頁類。

REST_FRAMEWORK = {
 'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyArticleCursorPagination',
}

響應(yīng)效果如下所示,你將得到previous和next分頁鏈接。頁碼都加密了, 鏈接里不再顯示頁碼號碼。默認(rèn)每頁展示3條記錄, 如果使用?page_size=2進行查詢,每頁你將得到兩條記錄。

當(dāng)然由于這個ordering字段與模型相關(guān),我們并不推薦全局使用自定義的CursorPagination類,更好的方式是在GenericsAPIView或視圖集viewsets中通過pagination_class屬性指定,如下所示:

from rest_framework import viewsets
from .pagination import MyArticleCursorPagination
 
 
 
 
class ArticleViewSet(viewsets.ModelViewSet):
 # 用一個視圖集替代ArticleList和ArticleDetail兩個視圖
 queryset = Article.objects.all()
 serializer_class = ArticleSerializer
 pagination_class = MyArticleCursorPagination
 # 自行添加,將request.user與author綁定
 def perform_create(self, serializer):
  serializer.save(author=self.request.user)
 
 
 # 自行添加,將request.user與author綁定
 def perform_update(self, serializer):
  serializer.save(author=self.request.user)

函數(shù)類視圖中使用分頁類

注意pagination_class屬性僅支持在genericsAPIView和視圖集viewset中配置使用。如果你使用函數(shù)或簡單的APIView開發(fā)API視圖,那么你需要對你的數(shù)據(jù)進行手動分頁,一個具體使用例子如下所示:

from rest_framework.pagination import PageNumberPagination
class ArticleList0(APIView):
 """
 List all articles, or create a new article.
 """
 def get(self, request, format=None):
  articles = Article.objects.all()
 
 
  page = PageNumberPagination() # 產(chǎn)生一個分頁器對象
  page.page_size = 3 # 默認(rèn)每頁顯示的多少條記錄
  page.page_query_param = 'page' # 默認(rèn)查詢參數(shù)名為 page
  page.page_size_query_param = 'size' # 前臺控制每頁顯示的最大條數(shù)
  page.max_page_size = 10 # 后臺控制顯示的最大記錄條數(shù),防止用戶輸入的查詢條數(shù)過大
  ret = page.paginate_queryset(articles, request)
  serializer = ArticleSerializer(ret, many=True)
 
 
  return Response(serializer.data)

小結(jié)

本文總結(jié)了DRF提供的3種分頁類并詳細(xì)演示了如何使用它們,你學(xué)會了嗎?

到此這篇關(guān)于Django REST Framework 分頁(Pagination)詳解的文章就介紹到這了,更多相關(guān)Django REST Framework 分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python with提前退出遇到的坑與解決方案

    python with提前退出遇到的坑與解決方案

    這篇文章主要介紹了python with提前退出遇到的坑與解決方法,需要的朋友參考下吧
    2018-01-01
  • Python語言實現(xiàn)SIFT算法

    Python語言實現(xiàn)SIFT算法

    SIFT,即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述,本文重點給大家介紹Python語言實現(xiàn)SIFT算法,感興趣的朋友一起看看吧
    2021-11-11
  • Python中numpy數(shù)組的計算與轉(zhuǎn)置詳解

    Python中numpy數(shù)組的計算與轉(zhuǎn)置詳解

    大家好,本篇文章主要講的是Python中numpy數(shù)組的計算與轉(zhuǎn)置詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Python使用fastAPI如何實現(xiàn)一個流式傳輸接口

    Python使用fastAPI如何實現(xiàn)一個流式傳輸接口

    這篇文章主要介紹了Python使用fastAPI如何實現(xiàn)一個流式傳輸接口問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 基于web管理OpenVPN服務(wù)的安裝使用詳解

    基于web管理OpenVPN服務(wù)的安裝使用詳解

    這篇文章主要為大家介紹了基于web管理OpenVPN服務(wù)的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • python繪制折線圖和條形圖的方法

    python繪制折線圖和條形圖的方法

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)折線圖和條形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • pyqt5制作登錄窗口的詳細(xì)過程

    pyqt5制作登錄窗口的詳細(xì)過程

    這篇文章主要介紹了pyqt5制作登錄窗口的詳細(xì)過程,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 教你pycharm快速添加遠(yuǎn)程環(huán)境的詳細(xì)過程

    教你pycharm快速添加遠(yuǎn)程環(huán)境的詳細(xì)過程

    今天通過本文給大家分享pycharm快速添加遠(yuǎn)程環(huán)境的過程,通過在setting中選擇設(shè)置符號add,具體詳細(xì)過程跟隨小編一起通過本文學(xué)習(xí)下吧
    2021-07-07
  • Python通過WHL文件實現(xiàn)離線安裝的操作詳解

    Python通過WHL文件實現(xiàn)離線安裝的操作詳解

    在Python開發(fā)中,我們經(jīng)常需要安裝第三方庫來擴展Python的功能,通常情況下,我們可以通過pip命令在線安裝這些庫,此時,WHL(Wheel)文件成為了非常實用的解決方案,本教程將結(jié)合實際案例,詳細(xì)介紹如何通過WHL文件在Python中進行離線安裝,需要的朋友可以參考下
    2024-08-08
  • MAC平臺基于Python Appium環(huán)境搭建過程圖解

    MAC平臺基于Python Appium環(huán)境搭建過程圖解

    這篇文章主要介紹了MAC平臺基于Python Appium環(huán)境搭建過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論