DRF-分页-官方文档

使用注意:
Pagination is only performed automatically if you’re using the generic views or viewsets. If you’re using a regular APIView, you’ll need to call into the pagination API yourself to ensure you return a paginated response. See the source code for the mixins.ListModelMixin and generics.GenericAPIView classes for an example.

1、LimitOffsetPagination

1.1、配置settings.py

# settings.pyREST_FRAMEWORK = {...# 分页 只有在使用通用视图或视图集时才会自动执行分页。如果您使用的是常规APIView,则需要自己调用分页 API 以确保返回分页响应'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 1,...
}

1.2、视图views.py

class UserInfoView(GenericAPIView, ListModelMixin):queryset = UserInfo.objects.all()serializer_class = UserInfoSerializerdef get(self, request):return self.list(request=request)

1.3、访问结果

    http://127.0.0.1:9989/vueshop/user/后面不带参数,默认取settings配置,进行分页;配置的是每页1条数据
    {"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?limit=1&offset=1","previous": null,"results": [{"id": 1,"username": "admin","mobile": "19856226325"}]
}
http://127.0.0.1:9989/vueshop/user/?limit=2
后面带参数了,就按limit的值进行分页;每页limit=2条数据
    {"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?limit=2&offset=2","previous": null,"results": [{"id": 1,"username": "admin","mobile": "19856226325"},{"id": 2,"username": "test","mobile": ""}]
}
http://127.0.0.1:9989/vueshop/user/?offset=1&limit=1
还可以自定义从哪条数据offset=1开始进行分页limit=1;从offset=1第二条数据开始,每页1条数据limit=1
    {"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?limit=1&offset=2","previous": "http://127.0.0.1:9989/vueshop/user/?limit=1","results": [{"id": 2,"username": "test","mobile": ""}]
}

2、PageNumberPagination

2.1、配置settings.py

# settings.pyREST_FRAMEWORK = {...# 分页 只有在使用通用视图或视图集时才会自动执行分页。如果您使用的是常规APIView,则需要自己调用分页 API 以确保返回分页响应'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 1,...
}

2.2、视图views.py

class UserInfoView(GenericAPIView, ListModelMixin):queryset = UserInfo.objects.all()serializer_class = UserInfoSerializerdef get(self, request):return self.list(request=request)

2.3、访问结果

    http://127.0.0.1:9989/vueshop/user/后面不带参数,默认取settings配置,进行分页;每页1条数据展示
   {"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?page=2","previous": null,"results": [{"id": 1,"username": "admin","mobile": "19856226325"}]
}
http://127.0.0.1:9989/vueshop/user/?page=2
后面带参数了,就按page的值进行分页;每页1条(setting配置的),显示第二页数据
   {"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?page=3","previous": "http://127.0.0.1:9989/vueshop/user/","results": [{"id": 2,"username": "test","mobile": ""}]
}
http://127.0.0.1:9989/vueshop/user/?page=1&page_size=2
还可以自定义每页数据量,并显示第几页;每页page_size=2,显示第page=1页数据
**注意**:实际请求参数的page_size=2并不生效,取的还是系统settings的值=1。如下图,一共3条数据,如果page_size=2生效,取第一页应该是2条数据,但实际是1条数据。这个问题下面解决。
{"count": 3,"next": "http://127.0.0.1:9989/vueshop/user/?page=2&page_size=2","previous": null,"results": [{"id": 1,"username": "admin","mobile": "19856226325"}]
}


从上面的源码可以看出page_size不生效的原因page_size_query_param=None,那么就需要自定义分页类,修改此属性。

3、自定义分页类

from collections import OrderedDictfrom rest_framework.pagination import PageNumberPagination# 自定义分页对象
from rest_framework.response import Responseclass MyPageNumberPagination(PageNumberPagination):# 1,默认的大小 [每页显示数量],如果不配置,就取settings的值page_size = 5# 2,前端可以指定页面大小,此字段名称决定了 url后面的 每页数量的字段page_size_query_param = 'page_size'# 3,页面的最大大小 [每页显示数量],如果前端传的值大于这个设置,就以这个值返回max_page_size = 999# 重写响应值的方法def get_paginated_response(self, data):return Response(OrderedDict([('page', self.page.number),('pages', self.page.paginator.num_pages), # 总页数('lists', data)  # 结果集]))

视图函数中设置pagination_class的值等于上面自定义的分页器类。

# views.py
class UserInfoView(GenericAPIView, ListModelMixin):queryset = UserInfo.objects.all()serializer_class = UserInfoSerializerpagination_class = MyPageNumberPaginationdef get(self, request):return self.list(request=request)

响应结果如下:

{"page": 1,"pages": 2,"lists": [{"id": 1,"username": "admin","mobile": "19856226325"},{"id": 2,"username": "test","mobile": ""}]
}

Django REST Framework-分页相关推荐

  1. Django REST framework 分页

    三种分页:根据页码.根据索引.根据加密 http://www.xx.com/courses/?page=1&size=10 http://www.xx.com/courses/?offset= ...

  2. 05 Django REST Framework 分页

    01-分页模式 rest framework中提供了三种分页模式:from rest_framework.pagination import PageNumberPagination, LimitOf ...

  3. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  4. 如何在 Django REST Framework 中对分页结果过滤和排序?

    作者 | 大江狗  责编 | 张文 来源 | Python Web 与 Django 开发 (ID:Python_Web_Django) 在本篇文章中我们将向你演示如何在 Django REST Fr ...

  5. Django REST framework的一些奇巧淫技(干货!!!)

    开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...

  6. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

  7. django html5 关系,Django REST FrameWork中文教程5:关系和超链接API

    目前我们的API中的关系是用主键表示的.我们将通过使用超链接来提高我们API的内部联系. 为我们的API创建一个根路径 现在我们有'snippets'和'users'的路径,但是我们的API没有一个入 ...

  8. Django Rest Framework(一)

    一.什么是RESTful REST与技术无关,代表一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移". R ...

  9. Django REST framework【学习内容】

    快速入门 我们将创建一个简单的允许管理员用户查看和编辑系统中的用户和组的API. 项目设置 创建一个名为 tutorial 的新django项目,然后启动一个名为 quickstart 的新app. ...

  10. Django REST framework API开发

    REST 介绍 RESTful API 设计 实现API的两种方式 FBV 视图函数 urlpatterns = [url(r'^user/$', views.user),url(r'^user/ad ...

最新文章

  1. Excel VBA参考文献中人名与年份格式转换
  2. pm2集群模式mysql配置_pm2 配置方式
  3. 项目实战解决 java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘.
  4. Leetcode--41. 缺失的第一个正数
  5. 将PHP文件生成静态文件源码
  6. 怎么搭建服务器集成环境配置文件,怎么搭建服务器集成环境配置文件
  7. lede 内核 单 编_openwrt和lede有何区别?
  8. java计算机毕业设计教务排课系统源码+mysql数据库+系统+lw文档+部署
  9. Q1营收利润大增,Take-Two如何掘金“次世代”?
  10. opencv IplImage和Mat的 区别和转换
  11. 平面设计什么情况下会用到对比构图与调和构图
  12. html5css字竖着显示,css如何设置竖排文字?
  13. size与capacity的区别
  14. vue组件中ctrl键和shift键操作多选
  15. 机器人三星云顶之弈_机器码|云顶之弈10.16三星机器人加强介绍-云顶之弈10.16三星机器人加强了吗_234游戏网...
  16. 一个emoji表情包处理工具类
  17. The server time zone value ‘ й ׼ʱ ‘ is unrecognized or represents more than one time zone. You mu
  18. 在socket 中使用域名
  19. spring Boot Configuration Annotation Processor not fount in classpath
  20. 2. 妈呀,Jackson原来是这样写JSON的

热门文章

  1. 海尔张瑞敏 :人不成熟的五大特征
  2. stm32 驱动 触摸屏
  3. 11. 将学生的学号及平均成绩定义为一个视图(s_g),学号用sno表示,平均成绩用gavg表示。
  4. nas 软件 性能测试,NAS性能测试
  5. 全部HTML代码学习
  6. 区块链世界里不能信什么?
  7. spring之spring security
  8. 使用layer弹窗实现 监听单选框radio改变事件
  9. Android ITelephony EndCall Remove 各版本挂断、拦截电话方法
  10. 毕业之前要做的20件事