Django rest framework分页接口实现原理解析

如果没有设置分页,django-rest-framework 会将所有资源类表序列化后返回,如果资源很多,就会对网站性能造成影响。为此,我们来给博客文章列表 API 添加分页功能。

django-rest-framework 为分页功能提供了多个辅助类,常用的有:

PageNumberPagination

将资源分为第 1 页、第 2 页...第 n 页,使用页码号请求分页结果。

LimitOffsetPagination

通过 limit 和 offset 两个参数来控制请求的资源。例如通过发送 API 请求:/posts/?offset=20&limit=5,将获取文章资源列表第 20 篇后的 5 篇文章。如果 offset 以等差数列递增,limit 保持不变,则等价于按页码分页。但 offset 和 limit 可以为任意值,因此这种分页比 PageNumberPagination 更加灵活。

要使用分页功能非常简单,只需在项目的配置文件中配置好分页选项,即可全局启用分页功能。打开 config/common.py 配置文件,写入如下的分页配置:

REST_FRAMEWORK = {
  # 设置 DEFAULT_PAGINATION_CLASS 后,将全局启用分页,所有 List 接口的返回结果都会被分页。
  # 如果想单独控制每个接口的分页情况,可不设置这个选项,而是在视图函数中进行配置
  "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
  # 这个选项控制分页后每页的资源个数
  "PAGE_SIZE": 10,
}

配置完成之后,所有通用视图函数或者视图集生成的资源列表 API,返回的资源列表都会被分页。配置文件中的分页设置将作用于全局,如果某个视图函数或者视图集不想使用全局配置怎么办呢?可以在视图函数或者视图集中设置 pagination_class 属性,指定需要使用的分页辅助类即可。例如将博客文章列表分页替换为 limit offset 的分页方式,可以这样设置:

from rest_framewrok.pagination import PageNumberPagination
class PostViewSet(viewsets.GenericViewSet):
  pagination_class = LimitOffsetPagination

这样,PostViewSet 视图集将返回 limit offset 分页形式的文章列表,而其他视图或者视图集仍将使用全局的分页配置。

请求文章 api,返回结果如下:

对返回结果的解释:

count:总资源数目

next:下一页资源的链接

previous:上一页资源的链接

results:当前页的资源列表

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Django+RestFramework API接口及接口文档并返回json数据操作

    系统:ubuntu18.04 x64 GitHub:https://github.com/xingjidemimi/DjangoAPI.git 安装 pip install django==2.1.5 pip install djangorestframework # rest api pip install coreapi pygments markdown # 自动化接口文档 API示例 创建django项目 django-admin startproject DjangoAPI 创建应用

  • django rest framework serializers序列化实例

    serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(api接口). - 将post与patch/put的上来的数据进行验证. - 对post与patch/put数据进行处理. 实现序列化二个类:Serializer与ModelSerializer 比较 ModelSerializer(Serializer) 即 ModelSerializer继承了Se

  • Django REST framework 单元测试实例解析

    这篇文章主要介绍了Django REST framework 单元测试实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 环境 Win10 Python3.7 Django2.2 项目 参照官网 快速开始 写了一个 demo 测试 参照官网 测试 和 Django 的测试差不多 创建 tutorial/tests/tests.py import json from django.test import TestCase from rest_

  • django rest framework serializer返回时间自动格式化方法

    django的时间是 models # models create_time = models.DateTimeField(blank=True, auto_now_add=True, null=True) 这是一个DateTimeField 我想返回的时候,直接格式化好 那就在 xxxSerializer(serializers.ModelSerializer): create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S

  • Django rest framework jwt的使用方法详解

    一简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.该信息可以被验证和信任,因为它是数字签名的.JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名. JWT的组成部分: header Header是由下面这个格式的Json通过Base64编码(编码不是加密,是可以通过反编码的方式获取到这个原来的Json,所以JWT中存放的一般是不敏感的信息)生成的字符串,Header中存放的

  • 浅谈django不使用restframework自定义接口与使用的区别

    django可以使用restframework快速开发接口,返回前端所需要的json数据,但是有时候利用restframework开发的接口并不能满足所有的需求,这时候就需要自己手动开发接口,也就是将需要用到的某些对象转化为需要使用的json数据,今天记录一下django自己定义接口的一种方法与思路 假设我们定义三张数据表,分别是问卷,问题,选项.一张问卷包含不同的问题,一个问题可以设置不同的选项,自定义的接口可以实现查看所有或单个问卷的标题与id,可以查看所有或单个问题的所属问卷,问题标题,问

  • django restframework serializer 增加自定义字段操作

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现这个目的. 假设现在有一个Animal模型,其中有name, type, country字段,country为外键.我们在序列化Animal时,需要额外增加外键country的area信息. 方法一修改数据库,利用model 这里就不多解释,主要来说第二种,不修改django的model,直接使用S

  • Django使用rest_framework写出API

    在Django中用rest_framework写API,写了一个用户注册的API,并测试成功. 本人环境:Django==2.2.1:djangorestframework==3.11.0 1.安装djangorestframework (1)终端中输入命令: pip install djangorestframework (2)在settings里面的INSTALL_APP里面,添加rest_framework应用: INSTALL_APP = [ ... 'rest_framework',

  • Django restframework 框架认证、权限、限流用法示例

    本文实例讲述了Django restframework 框架认证.权限.限流用法.分享给大家供大家参考,具体如下: 概述 Django Rest Framework 是一个强大且灵活的工具包,使用Django REST Framework可以在Django的基础上迅速实现API,用以构建Web API. 认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest

  • Django rest framework分页接口实现原理解析

    如果没有设置分页,django-rest-framework 会将所有资源类表序列化后返回,如果资源很多,就会对网站性能造成影响.为此,我们来给博客文章列表 API 添加分页功能. django-rest-framework 为分页功能提供了多个辅助类,常用的有: PageNumberPagination 将资源分为第 1 页.第 2 页...第 n 页,使用页码号请求分页结果. LimitOffsetPagination 通过 limit 和 offset 两个参数来控制请求的资源.例如通过发

  • Java枚举类接口实例原理解析

    这篇文章主要介绍了Java枚举类接口实例原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 枚举类可以实现一个或多个接口.与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法. 如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑. public interface IGradeHandler { String getGrade(String studentName)

  • Django REST Framework 分页(Pagination)详解

    在前面的DRF系列教程中,我们以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API端点,并详细对权限和认证(含jwt认证)进行了总结与演示.在本篇文章中我们将向你演示如何在Django REST Framework中使用分页. 分页 为什么要分页? 当你的数据库数据量非常大时,如果一次将这些数据查询出来, 必然加大了服务器内存的负载,降低了系统的运行速度.一种更好的方式是将数据分段展示给用户.如果用户在展示的分段数据中没有

  • Django REST framework 分页的实现代码

    官方文档[这里] 用于分页的模块: Pagination Django REST framework 有内置 Pagination 模块,无需额外安装, 只需做简单的配置. 配置什么呢? 就是告诉Django要用到什么样的分页样式, 比如: 返回哪些字段, 每页的大小, 请求参数的名称等等. 2种配置途径: 1.settings.py 文件里做全局的配置 2.单独为每个需要分页的 view 分配自定义分页器. 途径1是为所有继承ListViewAPI的接口做默认配置, 途径2对单独一个接口做个性

  • Django路由层URLconf作用及原理解析

    一.Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] Django 2.0版本中的路由系统已经替换成下面的写法(官方文档): from django

  • Spring Data JPA分页复合查询原理解析

    Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库. 此模块处理对基于JPA的数据访问层的增强支持. 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易. 在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦. 必须编写太多样板代码来执行简单查询以及执行分页和审计. Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现. 作为开发人员,您编写repository接口,包括自定义查找器方法,Spring

  • Django中ORM基本应用与原理解析

    目录 1.ORM构建数据表 2.数据迁移 3.Model相关的概念与使用方法 Model的组成部分 Meta元数据类属性说明 Field的通用字段选项 基础字段类型 关系字段类型 多对一 一对一 多对多关系类型 1.ORM构建数据表 由于每一个数据表对应一个Model定义,每一个Model都是一个Python类,所以,Model之间是可以继承的.Django规定,所有的Model都必须继承自django.db.models.Model Model中的所有字段都是django.db.models.

  • SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    这篇文章主要介绍了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring beand的作用域 设置为singleton时,相当于一个类只能有一个实例,当再次申请时,返回的是同一个实例 可以看到两个bean实例的hashcode值是一样的,说明在此申请到的是同一个实例 将bean的作用域设置为prototype时,再次运行,可以看到,申请到的是两个不同bean实例 目前只学习

  • 深度解析Django REST Framework 批量操作

    我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除. 下面我们来讨论这个问题,看看如何实现批量更新和删除操作. DRF基本情况 我们以下面的代码作为例子: models: from django.db import models # Create your models here. class Classroom(models.Model): location = models.CharField(max_length=128)

  • Python Django 简单分页的实现代码解析

    这篇文章主要介绍了Python Django 简单分页的实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 models.py: from django.db import models class Book(models.Model): title = models.CharField(max_length=32) def __str__(self): return self.title class Meta: db_table =

随机推荐