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

您的位置:首頁技術文章
文章詳情頁

Django REST Framework 分頁(Pagination)詳解

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

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

分頁

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

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

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

使用PageNumberPagination類

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

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

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

Django REST Framework 分頁(Pagination)詳解

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

第一步: 在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設置了每頁默認展示數據的條數,通過page_size_query_param設置了每頁size的參數名以及通過max_page_size設置了每個可以展示的最大數據條數。

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

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

from rest_framework import viewsetsfrom .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)

展示效果如下所示:

Django REST Framework 分頁(Pagination)詳解

當然定制分頁類不限于指定page_size和max_page_size這些屬性,你還可以改變響應數據的輸出格式。比如我們這里希望把next和previous放在一個名為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 分頁(Pagination)詳解

注意:重寫get_paginated_response方法非常有用,你還可以給分頁響應數據傳遞額外的內容,比如code狀態碼等等。

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

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

使用LimitOffsetPagination類

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

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

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

Django REST Framework 分頁(Pagination)詳解

你也可以自定義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}

展示效果如下所示:

Django REST Framework 分頁(Pagination)詳解

什么? 為什么會出錯誤? 使用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’,}

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

Django REST Framework 分頁(Pagination)詳解

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

from rest_framework import viewsetsfrom .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)

函數類視圖中使用分頁類

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

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() # 產生一個分頁器對象 page.page_size = 3 # 默認每頁顯示的多少條記錄 page.page_query_param = ’page’ # 默認查詢參數名為 page page.page_size_query_param = ’size’ # 前臺控制每頁顯示的最大條數 page.max_page_size = 10 # 后臺控制顯示的最大記錄條數,防止用戶輸入的查詢條數過大 ret = page.paginate_queryset(articles, request) serializer = ArticleSerializer(ret, many=True) return Response(serializer.data)

小結

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

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

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品欧美| 日韩欧美中文在线观看| 久久丁香四色| 国产精品亚洲欧美日韩一区在线| 国产欧美自拍一区| 国产欧美日韩一区二区三区四区| 国产精品一区二区三区av| 久久亚洲精精品中文字幕| 国产传媒在线观看| 免费视频亚洲| 国产亚洲综合精品| 日韩不卡一二三区| 国产一区二区三区久久| 国产综合精品| 中文日韩欧美| 国产精品丝袜在线播放| 欧美成人精品三级网站| 国产视频欧美| 国产精品白丝av嫩草影院| 91av亚洲| 亚洲精品无播放器在线播放| 九九九精品视频| 91久久视频| 久久不见久久见中文字幕免费| 久久久成人网| 日本伊人午夜精品| 久久影视三级福利片| 午夜欧美精品| 国产精品资源| 91精品久久久久久久久久不卡| 免费在线观看视频一区| 精品视频高潮| 丝袜美腿亚洲色图| 国产91在线精品| 亚洲免费影视| 国产一区二区三区四区大秀| 免费日韩视频| 精品久久久久中文字幕小说| 亚洲欧美日韩专区| 精品视频在线你懂得| 亚洲欧美日本日韩| 国产一区二区三区不卡av| 红桃视频国产一区| 国产成人精品亚洲线观看| 一区久久精品| 国产伊人久久| 日韩精品成人在线观看| 久久国产中文字幕| 久久激情av| 国产一区二区精品| 精品国产成人| 日韩不卡一区二区三区| 免费成人网www| 福利一区二区三区视频在线观看| 亚洲视频二区| 免费观看久久av| 国产成人精品福利| 国产亚洲精aa在线看| 夜久久久久久| 日韩在线免费| 国产一区不卡| 国产精品一在线观看| 中文一区一区三区免费在线观| 亚洲精品成人图区| 久久av日韩| 日本aⅴ免费视频一区二区三区| 午夜视频精品| 久久久精品久久久久久96| 老司机精品在线| 97精品资源在线观看| 国产毛片一区| 激情综合自拍| 性感美女一区二区在线观看| 久久女人天堂| 国产美女视频一区二区| 亚洲专区视频| 首页亚洲欧美制服丝腿| 午夜国产一区二区| 久久要要av| 91精品一区二区三区综合| 国产精品xx| 精品国产亚洲一区二区三区| 国产精品115| 久久只有精品| 国产黄大片在线观看| 精品不卡一区| 精品91福利视频| 久久精品国产99国产精品| 久久久久九九精品影院| 久久爱www成人| 风间由美中文字幕在线看视频国产欧美| 欧美精品不卡| 国产资源在线观看入口av| 高清av不卡| 99久久久国产精品美女| 欧美中文字幕一区二区| 国产中文一区| 在线综合视频| 日韩综合一区二区三区| 日韩成人一级| 国产精品啊v在线| 国内在线观看一区二区三区| 欧美男人天堂| 欧美在线亚洲| 国产精品视区| 亚洲精品成a人ⅴ香蕉片| 国产日韩一区二区三区在线播放| 国产精品视频3p| 国产精品白丝一区二区三区| 精品一区二区三区中文字幕| 国产一区二区三区四区大秀| 日韩毛片视频| 午夜国产精品视频| 日韩一区二区三区精品 | 亚洲精品免费观看| 久久国产人妖系列| 国产日韩中文在线中文字幕| 欧美激情一区| 天堂√8在线中文| 欧美特黄a级高清免费大片a级| 免费人成精品欧美精品| 91成人在线网站| 91视频久久| 国产精品嫩草99av在线| 午夜天堂精品久久久久| 免费在线亚洲| 精品欧美激情在线观看| 一区二区91| 麻豆国产精品| 亚洲经典在线| 国产精品毛片aⅴ一区二区三区| 国产一区二区三区视频在线| 99久久视频| 色8久久久久| 中文字幕高清在线播放| 亚洲视频播放| 久久精品国产网站| 久久一区二区中文字幕| 在线精品视频一区| 久久99蜜桃| 国产亚洲网站| 国产+成+人+亚洲欧洲在线| 国产日韩专区| 成人台湾亚洲精品一区二区| 99riav1国产精品视频| 国产日韩1区| 蜜桃tv一区二区三区| 日韩超碰人人爽人人做人人添| 国产超碰精品| 久久精品99国产精品日本| 91久久国产| 免费看一区二区三区| 美女久久一区| 美女av在线免费看| 亚洲区国产区| 视频小说一区二区| 国产精品免费不| 欧美日韩国产亚洲一区| 国产精品v一区二区三区| 99re国产精品| 日韩中文字幕高清在线观看| 人人爱人人干婷婷丁香亚洲| 久久精品不卡| 国产一区调教| 久久精品99久久久| 美女91精品| 久久久天天操| 久久香蕉精品香蕉| 亚洲精品动态| 黄色成人精品网站| 欧美亚洲日本精品| 久久国产生活片100| 欧美中文日韩| 亚洲国产专区| 麻豆网站免费在线观看| 国产精品a级| 日韩有吗在线观看| 欧美日韩第一| 青青久久av| 成人在线免费观看91| 欧美亚洲自偷自偷| 日韩精品一二三四| 欧美.日韩.国产.一区.二区 | 国产欧美日韩精品一区二区免费| 尤物网精品视频| 99久久精品网| 日韩在线欧美| а√天堂8资源中文在线| 国产精选久久| 欧美天堂一区| 视频精品一区| 亚洲影视一区二区三区| 99国产精品久久久久久久成人热 | 久久永久免费| 国产精品欧美三级在线观看| 日本不卡一区二区三区| 日韩精品视频中文字幕| 日韩中文字幕91| 欧美中文字幕| 免费久久精品视频|