日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django REST Framework 分頁(yè)(Pagination)詳解

瀏覽:23日期:2024-09-16 11:44:04

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

分頁(yè)

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

Django REST Framework提供3種分頁(yè)類,接下來(lái)我們會(huì)分別進(jìn)行演示。

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

使用PageNumberPagination類

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

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

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

Django REST Framework 分頁(yè)(Pagination)詳解

但是如果你希望用戶按?page=3&size=10這種更靈活的方式進(jìn)行查詢,你就要進(jìn)行個(gè)性化定制。在實(shí)際開發(fā)過(guò)程中,定制比使用默認(rèn)的分頁(yè)類更常見(jià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

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

第二步:使用自定義的分頁(yè)類

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

from rest_framework import viewsetsfrom .pagination import MyPageNumberPagination class ArticleViewSet(viewsets.ModelViewSet): # 用一個(gè)視圖集替代ArticleList和ArticleDetail兩個(gè)視圖 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)

展示效果如下所示:

Django REST Framework 分頁(yè)(Pagination)詳解

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

from rest_framework.pagination import PageNumberPaginationfrom 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 })

新的展示效果如下所示:

Django REST Framework 分頁(yè)(Pagination)詳解

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

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

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

使用LimitOffsetPagination類

使用這個(gè)分頁(yè)類最簡(jiǎn)單的方式就是在settings.py中進(jìn)行全局配置,如下所示:

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

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

Django REST Framework 分頁(yè)(Pagination)詳解

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

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}

展示效果如下所示:

Django REST Framework 分頁(yè)(Pagination)詳解

什么? 為什么會(huì)出錯(cuò)誤? 使用CursorPagination類需要你的模型里有created這個(gè)字段,否則你需要手動(dòng)指定ordering字段。這是因?yàn)镃ursorPagination類只能對(duì)排過(guò)序的查詢集進(jìn)行分頁(yè)展示。我們的Article模型只有create_date字段,沒(méi)有created這個(gè)字段,所以會(huì)報(bào)錯(cuò)。

為了解決這個(gè)問(wèn)題,我們需要自定義一個(gè)MyCursorPagination類,手動(dòng)指定按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, 使用自己定義的分頁(yè)類。

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

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

Django REST Framework 分頁(yè)(Pagination)詳解

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

from rest_framework import viewsetsfrom .pagination import MyArticleCursorPagination class ArticleViewSet(viewsets.ModelViewSet): # 用一個(gè)視圖集替代ArticleList和ArticleDetail兩個(gè)視圖 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ù)類視圖中使用分頁(yè)類

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

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

小結(jié)

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

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

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
老牛影视精品| 国产精品99免费看| 国产毛片久久久| 国产精品国码视频| 日韩黄色大片| 女人天堂亚洲aⅴ在线观看| 亚洲一区二区网站| 日韩精品高清不卡| 亚洲精一区二区三区| 日韩精品五月天| 日本久久综合| 亚洲婷婷免费| 日本一区二区三区视频在线看| 91久久在线| 视频在线在亚洲| 国产精品一区二区精品视频观看| 免费在线小视频| 国产在线日韩| 日韩区欧美区| 日韩88av| 综合干狼人综合首页| 国产一区国产二区国产三区 | 亚洲综合小说| 日韩二区在线观看| 日韩电影二区| 亚洲深深色噜噜狠狠爱网站| 精品国产午夜肉伦伦影院| 久久男女视频| 日韩不卡在线观看日韩不卡视频 | 精品国产亚洲一区二区三区| 91精品综合| 国产亚洲福利| 精品三级国产| 日韩中文字幕亚洲一区二区va在线 | 亚洲成av在线| 蜜桃免费网站一区二区三区| 精品国产亚洲一区二区三区大结局 | 国产在视频一区二区三区吞精| 亚洲aa在线| 欧美激情综合| 久久婷婷久久| 91大神在线观看线路一区| 免费看av不卡| 亚洲精品日本| 久久精品青草| 日韩精品1区2区3区| 激情视频一区二区三区| 国产欧美日韩精品一区二区免费| 日本在线不卡视频| 福利欧美精品在线| 亚洲精品激情| 99热国内精品| 捆绑调教美女网站视频一区| 丝袜诱惑制服诱惑色一区在线观看 | 欧美精品一二| 国产精品极品国产中出| 噜噜噜躁狠狠躁狠狠精品视频| 久久要要av| 日韩专区视频网站| 欧美日韩精品一本二本三本| 国产成人精品三级高清久久91| 麻豆精品蜜桃视频网站| 久久成人亚洲| 国产不卡精品| 国产精品白浆| 中文一区一区三区免费在线观 | 欧美激情精品| 国产二区精品| 麻豆视频观看网址久久| 日本va欧美va瓶| 中国女人久久久| 欧美日韩在线网站| 久草免费在线视频| 日本va欧美va瓶| 亚洲图片久久| 激情五月综合| 国产综合欧美| 久久精品影视| 久久国产直播| 日韩另类视频| 中文字幕成在线观看| 免费一级欧美片在线观看网站| 欧美日韩午夜| 视频一区国产视频| 免费观看不卡av| 久久网站免费观看| 亚洲爱爱视频| 午夜精品久久久久久久久久蜜桃| 国产字幕视频一区二区| 三级在线看中文字幕完整版| 成人在线视频区| 在线天堂中文资源最新版| 成人精品国产亚洲| 日本精品黄色| 中文字幕系列一区| 久久九九精品| 欧美日韩日本国产亚洲在线 | 91视频精品| 日韩精品一区二区三区中文 | 欧美天堂一区| 在线精品一区| 亚洲综合小说| 久久国产精品久久w女人spa| 中文国产一区| 日韩中文字幕亚洲一区二区va在线| 色婷婷成人网| 亚洲精品无播放器在线播放| 日日夜夜免费精品| 国产亚洲一区二区三区不卡| 日韩精品高清不卡| 国产精品一区二区三区四区在线观看 | 国产婷婷精品| 免费精品国产的网站免费观看| 综合亚洲自拍| 伊人久久亚洲| 国产精品一区二区三区美女 | 秋霞影院一区二区三区 | 狠狠久久伊人| 奇米狠狠一区二区三区| 亚洲作爱视频| 日本大胆欧美人术艺术动态| 丝袜美腿一区二区三区| 亚洲涩涩av| 国产精品亚洲综合在线观看| 国产精品一区二区av日韩在线| 神马午夜久久| 亚洲国产日韩欧美在线| 久久夜色精品| 日韩高清中文字幕一区| 蜜桃精品视频| 精品丝袜在线| 蜜臀精品一区二区三区在线观看| 国产调教一区二区三区| 久久国产精品免费一区二区三区| yellow在线观看网址| 最近高清中文在线字幕在线观看1| 在线精品亚洲| 日韩中文一区二区| 国精品产品一区| 亚洲福利久久| 午夜亚洲福利| 国产精品黄色片| 日韩精品91| 蜜桃视频第一区免费观看| 青草久久视频| 日韩在线观看不卡| 国产精品嫩草99av在线| 欧美另类中文字幕| 国产夫妻在线| 欧美日韩视频| 国产精品亚洲综合色区韩国| 色婷婷综合网| 久久亚洲风情| 久久久久伊人| 午夜在线视频观看日韩17c| 日韩不卡手机在线v区| 中文在线免费视频| 亚洲精品黄色| 91欧美国产| 日韩精品亚洲专区在线观看| 国产成人免费av一区二区午夜| 国产丝袜一区| 欧美成人a交片免费看| 国产高清一区| 日韩成人午夜精品| 亚洲啊v在线| 日韩二区在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 蜜桃久久精品一区二区| 国产精品嫩草影院在线看| 女生影院久久| 欧美久久一区二区三区| 99精品网站| 国产日韩欧美一区在线| 日韩精品一区二区三区免费观看| 精品视频高潮| 国产农村妇女精品一二区| 日韩va亚洲va欧美va久久| 亚洲91视频| 国产精品对白久久久久粗| 国产精品日韩久久久| 97精品国产| 日韩中文字幕| 亚洲精品一二三区区别| 美女精品久久| 日韩av午夜在线观看| 激情欧美一区二区三区| 久久一区欧美| 国产日韩三级| 蜜臀91精品一区二区三区| 欧美日韩亚洲在线观看| 国产免费av国片精品草莓男男| 97精品国产99久久久久久免费| 国产专区一区| 久久中文字幕一区二区三区| 中文一区二区| 一区二区精品伦理...| 国产精品久久久久久妇女 | 免费欧美在线视频| 日本久久精品|