rest_framework中的分页功能

为什么要使用分页

我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。

通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。

分页的三种方式

方式一:基本的分页,就是正常的查第几页每页显示多少条

model.py

from django.db import models

# Create your models here.
from django.db import models


class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)

    def __str__(self):
        return self.name

serializer.py

from rest_framework import serializers
from .models import Book, Publish


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

page.py

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination


class CommonPageNumberPagination(PageNumberPagination):
    # 有4个类属性
    # 每页显示条数
    page_size = 2
    # 分页查询的那个参数 ?page=10
    page_query_param = 'page'
    # ?page=3&size=3 查询3页,每页查询3条
    page_size_query_param = 'size'
    # 可以通过size控制每页显示的条数,但是通过这个参数控制最多显示多少条
    max_page_size = 3

view.py

from django.shortcuts import render

# Create your views here.
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import ViewSetMixin

from app01.models import Book
from app01.serializer import BookSerializer

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
# as 后面是起的别名,将我们写的类导入进来
from .page import CommonPageNumberPagination as PageNumberPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # pagination_class后面是我们自己写的类,只不过在导入的时候我们重新命名了
    pagination_class = PageNumberPagination

image

image

方式二:偏移分页:可以直接从第几页第几个位置开始拿数据 offset=6&limit=2

page.py

class CommonLimitOffsetPagination(LimitOffsetPagination):
    # 每页显示多少条
    default_limit = 2
    # 可以直接从第几页第几个位置开始拿数据 offset=6&limit=2
    limit_query_param = 'limit'  # 取多少条
    # 从第0个位置偏移多少开始取数据
    offset_query_param = 'offset'
    # 最大限制条数
    max_limit = 5

view.py

from .page import CommonLimitOffsetPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    pagination_class = CommonLimitOffsetPagination

image

方式三:游标分页式分页

效率高,但是可控性差,只能选择上一页与下一页,不能直接跳转到某一页,这种针对于大数据
page.py

class CommonCursorPagination(CursorPagination):
    # 查询的名字
    cursor_query_param = 'cursor'
    # 每页显示多少条
    page_size = 3
    # 必须是表中有的字段,一般用id
    ordering = 'id'

view.py

from .page import CommonCursorPagination
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    pagination_class = CommonCursorPagination

image

如果使用APIView或者GenericAPIView分页

# 如果使用APIView分页
class BookView(APIView):
    def get(self,request,*args,**kwargs):
        book_list=models.Book.objects.all()
        # 1.实例化得到一个分页器对象,MyPageNumberPagination这个是我们自己写好的分页器类
        page_cursor=MyPageNumberPagination()
        # 2.使用分页器对象的paginate_queryset方法,该方法内传入queryset、request和当前视图类参数,注意返回值其实是一个新的queryset,替代了book_list
        book_list=page_cursor.paginate_queryset(book_list,request,view=self)
        # 3.分页器对象的get_next_link和get_previous_link是取到下一页和上一页的url,然后可以返回给前端(就是将next_url放在下面的Response里返回,前端页面就可以显示出来上下页的url了
        next_url =page_cursor.get_next_link()
        pr_url=page_cursor.get_previous_link()
        # print(next_url)
        # print(pr_url)
        book_ser=BookModelSerializer(book_list,many=True)
        return Response(data=book_ser.data)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:rest_framework中的分页功能 - Python技术站

(0)
上一篇 2023年4月2日 下午4:40
下一篇 2023年4月2日

相关文章

  • 基本运算符

    基本运算符 算术运算符 print(10+2) # 加减乘除运算符 print(10 / 3) print(10 // 3) # 只保留整数部分 print(10 % 3) # 取余数 print(10 ** 3) # 幂方运算 比较运算符 <、>、>=、<=、==、!= 赋值运算符 # =:变量赋值 # +=、-=、*=、**=、/…

    Python开发 2023年4月2日
    00
  • 文章的评论(跟评论与子评论的制作)

    文章的评论制作 先做跟评论,在做子评论 发表评论框的制作:前端渲染发表评论框: {# 评论功能开始#} {% if request.user.is_authenticated %} <div> <p><span class=”glyphicon glyphicon-comment”>发表评论:</span>&l…

    2023年4月2日
    00
  • 小程序开发环境搭建

    如何开发微信小程序 小程序:学习微信开发的语言(前端html、css、js、vue.js) 微信开发者工具 API:restful接口(Python+django+drf框架)。 pycharm 环境搭建 python环境搭建 虚拟环境 django drf pycharm 小程序环境 在微信公众平台上注册一个小程序账号 在开发设置里保存好自己的appid …

    2023年4月2日
    00
  • flask操作数据库

    flask操作数据库 准备工作 安装flask-script(版本过高可能会报错) pip install flask-script==2.0.3 使用flask-script里的Manager类实例化来管理项目的启动等 from apps import create_app from flask_script import Manager app = cr…

    2023年4月2日
    00
  • 基于tcp协议的套接字通信

    1、套接字socket简介 Socket是应用层与TCP/UDP协议通信的中间软件抽象层,它充当一种接口的角色!封装了传输层以下的东西。 1.1基于tcp的socket通信流程图 2.tcp服务端搭建 需求:模拟两个手机的通话 from ipaddress import IPv4Address import socket # 1.买手机 # socket.A…

    2023年4月2日
    00
  • django中的cookie、session和token

    发展史 1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站! 2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等! 3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。 4.为了解决上述的麻烦,便产生了cookie和ses…

    2023年4月2日
    00
  • 面向对象高级–反射、内置方法和元类

    1.反射 1.1什么是反射 python是一门动态语言,而反射机制被视为动态语言的关键! 反射机制指的是:在程序的运行过程中,动态的获取程序的信息和对象的功能! ‘动态’:指一开始不知道程序的信息和对象的功能,只有等到运行到那的时候才会动态获取!!! 比如:x=18 在程序运行的时候,python才会通过反射机制动态的获取到这个值是整型,并不需要一开始定义的…

    Python开发 2023年4月2日
    00
  • 基础数据类型之集合

    1.集合的定义 在{}内用逗号分开多个元素,多个元素满足以下三个条件: 1.集合元素必须是不可变类型2.集合元素无序3.集合内元素没有重复(打印出来会自动去重) d = {} 默认是定义空字典 需要定义空集合,需要使用s = set() 2,集合的作用 (1)关系运算 # 如何取出这两个人共同的朋友呢? friend1=[‘zhang’,’yang’,’li…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部