在前面的DRF系列教程中,我们以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限和认证(含jwt认证)进行了总结与演示。在本篇文章中我们将向你演示如何在Django REST Framework中使用分页。
分页
为什么要分页"created"这个字段,否则你要手动指定ordering排序才能进行使用。
使用PageNumberPagination类
DRF中使用默认分页类的最简单方式就是在settings.py中进行全局配置,如下所示:
REST_FRAMEWORK ={ 'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE':2 }
展示效果如下,每页展示两条记录, 不支持用户指定每页展示数据的数量。
但是如果你希望用户按"htmlcode">
from rest_framework.pagination import PageNumberPagination class MyPageNumberPagination(PageNumberPagination): page_size = 2 # default page size page_size_query_param = 'size' # "htmlcode">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)展示效果如下所示:
当然定制分页类不限于指定page_size和max_page_size这些属性,你还可以改变响应数据的输出格式。比如我们这里希望把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' # "text-align: center">注意:重写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条。
你也可以自定义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 }展示效果如下所示:
什么"htmlcode">
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条记录, 如果使用"text-align: center">
当然由于这个ordering字段与模型相关,我们并不推荐全局使用自定义的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)函数类视图中使用分页类
注意pagination_class属性仅支持在genericsAPIView和视图集viewset中配置使用。如果你使用函数或简单的APIView开发API视图,那么你需要对你的数据进行手动分页,一个具体使用例子如下所示:
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() # 产生一个分页器对象 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种分页类并详细演示了如何使用它们,你学会了吗?
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 三国志8重制版恶名怎么消除 恶名影响与消除方法介绍
- 模拟之声慢刻CD《柏林之声5》2019[原抓WAV+CUE]
- AlexandraSoumm-Parisestunefte(2024)[24Bit-96kHz]FLAC
- 李嘉《国语转调1》[天王唱片][WAV整轨]
- 不是哥们 这都能跑?网友展示用720显卡跑《黑神话》
- 玩家自制《黑神话:悟空》亢金星君3D动画 现代妆容绝美
- 大佬的审美冲击!《GTA6》环境设计师展示最新作品
- 纪晓君.2001-野火·春风【魔岩】【WAV+CUE】
- 汪峰.2005-怒放的生命【创盟音乐】【WAV+CUE】
- 群星.1995-坠入情网【宝丽金】【WAV+CUE】
- 群星《谁杀死了Hi-Fi音乐》涂鸦精品 [WAV+CUE][1G]
- 群星1998《宝丽金最精彩98》香港首版[WAV+CUE][1G]
- 汪峰《也许我可以无视死亡》星文[WAV+CUE][1G]
- 李嘉-1991《国语转调2》[天王唱片][WAV整轨]
- 蔡琴2008《金声回忆录101》6CD[环星唱片][WAV整轨]