Django rest framework(6)----分页

第一种分页 PageNumberPagination

基本使用

(1)urls.py

urlpatterns = [
re_path('(?P<version>[v1|v2]+)/page1/', Pager1View.as_view(),) #分页1
]

(2)api/utils/serializers/pager.py

# api/utils/serializsers/pager.py

from rest_framework import serializers
from api import models class PagerSerialiser(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"

(3)views.py

from api.utils.serializsers.pager import PagerSerialiser
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#获取所有数据
roles = models.Role.objects.all()
#创建分页对象
pg = PageNumberPagination()
#获取分页的数据
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#对数据进行序列化
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)

(4)settings配置

REST_FRAMEWORK = {
#分页
"PAGE_SIZE":2 #每页显示多少个
}

自定义分页类

#自定义分页类
class MyPageNumberPagination(PageNumberPagination):
#每页显示多少个
page_size = 3
#默认每页显示3个,可以通过传入pager1/?page=2&size=4,改变默认每页显示的个数
page_size_query_param = "size"
#最大页数不超过10
max_page_size = 10
#获取页码数的
page_query_param = "page" class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#获取所有数据
roles = models.Role.objects.all()
#创建分页对象,这里是自定义的MyPageNumberPagination
pg = MyPageNumberPagination()
#获取分页的数据
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#对数据进行序列化
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)

第二种分页 LimitOffsetPagination

自定义

#自定义分页类2
class MyLimitOffsetPagination(LimitOffsetPagination):
#默认显示的个数
default_limit = 2
#当前的位置
offset_query_param = "offset"
#通过limit改变默认显示的个数
limit_query_param = "limit"
#一页最多显示的个数
max_limit = 10 class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#获取所有数据
roles = models.Role.objects.all()
#创建分页对象
pg = MyLimitOffsetPagination()
#获取分页的数据
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#对数据进行序列化
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)


返回的时候可以用get_paginated_response方法

自带上一页下一页

第三种分页 CursorPagination

加密分页方式,只能通过点“上一页”和下一页访问数据

#自定义分页类3 (加密分页)
class MyCursorPagination(CursorPagination):
cursor_query_param = "cursor"
page_size = 2 #每页显示2个数据
ordering = 'id' #排序
page_size_query_param = None
max_page_size = None class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#获取所有数据
roles = models.Role.objects.all()
#创建分页对象
pg = MyCursorPagination()
#获取分页的数据
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#对数据进行序列化
ser = PagerSerialiser(instance=page_roles,many=True)
# return Response(ser.data)
return pg.get_paginated_response(ser.data)

代码

版本、解析器、序列化和分页

# MyProject2/urls.py

from django.contrib import admin
from django.urls import path,include urlpatterns = [
#path('admin/', admin.site.urls),
path('api/',include('api.urls') ),
]
# api/urls.py

from django.urls import path,re_path
from .views import UserView,PaserView,RolesView,UserInfoView,GroupView,UserGroupView
from .views import Pager1View urlpatterns = [
re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'), #版本
path('paser/', PaserView.as_view(),), #解析
re_path('(?P<version>[v1|v2]+)/roles/', RolesView.as_view()), #序列化
re_path('(?P<version>[v1|v2]+)/info/', UserInfoView.as_view()), #序列化
re_path('(?P<version>[v1|v2]+)/group/(?P<pk>\d+)/', GroupView.as_view(),name = 'gp'), #序列化生成url
re_path('(?P<version>[v1|v2]+)/usergroup/', UserGroupView.as_view(),), #序列化做验证
re_path('(?P<version>[v1|v2]+)/pager1/', Pager1View.as_view(),) #分页1
]
# api/models.py

from django.db import models

class UserInfo(models.Model):
USER_TYPE = (
(1,'普通用户'),
(2,'VIP'),
(3,'SVIP')
) user_type = models.IntegerField(choices=USER_TYPE)
username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=64)
group = models.ForeignKey('UserGroup',on_delete=models.CASCADE)
roles = models.ManyToManyField('Role') class UserToken(models.Model):
user = models.OneToOneField('UserInfo',on_delete=models.CASCADE)
token = models.CharField(max_length=64) class UserGroup(models.Model):
title = models.CharField(max_length=32) class Role(models.Model):
title = models.CharField(max_length=32)
# api/views.py
import json from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.versioning import URLPathVersioning
from . import models ##########################################版本和解析器##################################################### class UserView(APIView): def get(self,request,*args,**kwargs):
#获取版本
print(request.version)
#获取处理版本的对象
print(request.versioning_scheme)
#获取浏览器访问的url,reverse反向解析
#需要两个参数:viewname就是url中的别名,request=request是url中要传入的参数
#(?P<version>[v1|v2]+)/users/,这里本来需要传version的参数,但是version包含在request里面,所有只需要request=request就可以
url_path = request.versioning_scheme.reverse(viewname='api_user',request=request)
print(url_path)
self.dispatch
return HttpResponse('用户列表') # from rest_framework.parsers import JSONParser,FormParser class PaserView(APIView):
'''解析'''
# parser_classes = [JSONParser,FormParser,]
#JSONParser:表示只能解析content-type:application/json的头
#FormParser:表示只能解析content-type:application/x-www-form-urlencoded的头 def post(self,request,*args,**kwargs):
#获取解析后的结果
print(request.data)
return HttpResponse('paser') ###########################################序列化########################################################### from rest_framework import serializers #要先写一个序列化的类
class RolesSerializer(serializers.Serializer):
#Role表里面的字段id和title序列化
id = serializers.IntegerField()
title = serializers.CharField() class RolesView(APIView):
def get(self,request,*args,**kwargs):
# 方式一:对于[obj,obj,obj]
# (Queryset)
# roles = models.Role.objects.all()
# 序列化,两个参数,instance:Queryset 如果有多个值,就需要加 mangy=True
# ser = RolesSerializer(instance=roles,many=True)
# 转成json格式,ensure_ascii=False表示显示中文,默认为True
# ret = json.dumps(ser.data,ensure_ascii=False) # 方式二:
role = models.Role.objects.all().first()
ser = RolesSerializer(instance=role, many=False)
ret = json.dumps(ser.data, ensure_ascii=False)
return HttpResponse(ret) # class UserInfoSerializer(serializers.Serializer):
# '''序列化用户的信息'''
# #user_type是choices(1,2,3),显示全称的方法用source
# type = serializers.CharField(source="get_user_type_display")
# username = serializers.CharField()
# password = serializers.CharField()
# #group.title:组的名字
# group = serializers.CharField(source="group.title")
# #SerializerMethodField(),表示自定义显示
# #然后写一个自定义的方法
# rls = serializers.SerializerMethodField()
#
# def get_rls(self,row):
# #获取用户所有的角色
# role_obj_list = row.roles.all()
# ret = []
# #获取角色的id和名字
# #以字典的键值对方式显示
# for item in role_obj_list:
# ret.append({"id":item.id,"title":item.title})
# return ret # class UserInfoSerializer(serializers.ModelSerializer):
# type = serializers.CharField(source="get_user_type_display")
# group = serializers.CharField(source="group.title")
# rls = serializers.SerializerMethodField()
#
# def get_rls(self, row):
# # 获取用户所有的角色
# role_obj_list = row.roles.all()
# ret = []
# # 获取角色的id和名字
# # 以字典的键值对方式显示
# for item in role_obj_list:
# ret.append({"id": item.id, "title": item.title})
# return ret
#
# class Meta:
# model = models.UserInfo
# fields = ['id','username','password','type','group','rls'] # class UserInfoSerializer(serializers.ModelSerializer):
# class Meta:
# model = models.UserInfo
# #fields = "__all__"
# fields = ['id','username','password','group','roles']
# #表示连表的深度
# depth = 1 class UserInfoSerializer(serializers.ModelSerializer):
group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')
class Meta:
model = models.UserInfo
#fields = "__all__"
fields = ['id','username','password','group','roles']
#表示连表的深度
depth = 0 class UserInfoView(APIView):
'''用户的信息'''
def get(self,request,*args,**kwargs):
users = models.UserInfo.objects.all()
#这里必须要传参数context={'request':request}
ser = UserInfoSerializer(instance=users,many=True,context={'request':request})
ret = json.dumps(ser.data,ensure_ascii=False)
return HttpResponse(ret) class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserGroup
fields = "__all__" class GroupView(APIView):
def get(self,request,*args,**kwargs):
pk = kwargs.get('pk')
obj = models.UserGroup.objects.filter(pk=pk).first() ser = GroupSerializer(instance=obj,many=False)
ret = json.dumps(ser.data,ensure_ascii=False)
return HttpResponse(ret) ####################################序列化之用户请求数据验证验证#################################### #自定义验证规则
class GroupValidation(object):
def __init__(self,base):
self.base = base def __call__(self, value):
if not value.startswith(self.base):
message = "标题必须以%s为开头"%self.base
raise serializers.ValidationError(message) class UserGroupSerializer(serializers.Serializer):
title = serializers.CharField(validators=[GroupValidation('以我开头'),]) class UserGroupView(APIView):
def post(self,request,*args, **kwargs):
ser = UserGroupSerializer(data=request.data)
if ser.is_valid():
print(ser.validated_data['title'])
else:
print(ser.errors) return HttpResponse("用户提交数据验证") ##################################################分页################################################### from api.utils.serializsers.pager import PagerSerialiser
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination # #自定义分页类1
# class MyPageNumberPagination(PageNumberPagination):
# #每页显示多少个
# page_size = 3
# #默认每页显示3个,可以通过传入pager1/?page=2&size=4,改变默认每页显示的个数
# page_size_query_param = "size"
# #最大页数不超过10
# max_page_size = 10
# #获取页码数的
# page_query_param = "page" #自定义分页类2
class MyLimitOffsetPagination(LimitOffsetPagination):
#默认显示的个数
default_limit = 2
#当前的位置
offset_query_param = "offset"
#通过limit改变默认显示的个数
limit_query_param = "limit"
#一页最多显示的个数
max_limit = 10 #自定义分页类3 (加密分页)
class MyCursorPagination(CursorPagination):
cursor_query_param = "cursor"
page_size = 2 #每页显示2个数据
ordering = 'id' #排序
page_size_query_param = None
max_page_size = None class Pager1View(APIView):
def get(self,request,*args,**kwargs):
#获取所有数据
roles = models.Role.objects.all()
#创建分页对象
pg = MyCursorPagination()
#获取分页的数据
page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
#对数据进行序列化
ser = PagerSerialiser(instance=page_roles,many=True)
return Response(ser.data)
# return pg.get_paginated_response(ser.data)
# api/utils/serializsers/pager.py

from rest_framework import serializers
from api import models class PagerSerialiser(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__" api/utils/serializsers/pager.py

15.DRF-分页的更多相关文章

  1. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  2. laravel基础课程---15、分页及验证码(lavarel分页效果如何实现)

    laravel基础课程---15.分页及验证码(lavarel分页效果如何实现) 一.总结 一句话总结: 数据库的paginate方法:$data=\DB::table("user" ...

  3. drf 分页,获取fk,choise,m2m等字段数据(序列化)

    1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...

  4. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  5. DRF 分页组件

    Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...

  6. DRF分页组件

    为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能 ...

  7. 【DRF分页】

    目录 第一种 PageNumberPagination 查第n页,每页显示n条数据 第二种 LimitOffsetPagination 在第n个位置,向后查n条数据 第三种 CursorPaginat ...

  8. 15.DRF学习以及相关源码阅读

    1.http请求协议 代码很枯燥,结果和奇妙. 1.cbv django.vuews import View classs LoginView(View): def get(self,requset) ...

  9. drf分页组件补充

    drf偏移分页组件 pahenations.py from rest_framework.pagination import LimitOffsetPagination class MyLimitOf ...

  10. drf分页功能

    什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1 个接口,根据method的不 ...

随机推荐

  1. [安卓基础] 003.建立你的第一个App

    创建一个android工程项目 我们使用android提供的集成开发工具(Eclipse+ADT)来创建android工程项目.用这个集成开发工具创建项目,简单,方便,快捷,且自动帮助我们生成基础的文 ...

  2. [SD喜爱语言PK大赛]001.PHP vs Node.js

    引言:近日,两大编程飓风之战已经愈演愈烈.在程序员社区,一些争端因PHP与Node.js而起. 观点:其实就本人及团队而言,Language just a language!不存在高低之分,而侧重的原 ...

  3. (五)Ajax修改购物车单品数量

    需要gson-2.2.4.jar BookServlet.java package com.aff.bookstore.servlet; import java.io.IOException; imp ...

  4. Codeforces Round #646 (Div. 2)【B. Subsequence Hate题解】

    具体思路已经在代码注释中给出,这里不再赘述. #include<iostream> #include<algorithm> using namespace std; int t ...

  5. Flutter,webview里面实现上传和下载的功能

    前提:Flutter 与 webview(vue) 一起开发的项目 开始的时候并没有想到什么移动端的,所以上传就用input,下载就用iframe来实现,然而真机实测的时候,input那个方法IOS支 ...

  6. Chisel3 - model - Hardware Model

    https://mp.weixin.qq.com/s/x6j7LZg7i7i_KcNEA8YCQw   Chisel作为领域专用语言(DSL),用于构建硬件模型.待硬件模型建立后,再基于模型进行仿真. ...

  7. Java实现 LeetCode 500 键盘行

    500. 键盘行 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词.键盘如下图所示. 示例: 输入: ["Hello", "Alaska", & ...

  8. Java实现 LeetCode 414 第三大的数

    414. 第三大的数 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大 ...

  9. Java实现 蓝桥杯VIP 算法训练 阿尔法乘积

    蓝桥杯–阿尔法乘积 问题描述 计算一个整数的阿尔法乘积.对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身:否则的话,x的阿尔法乘积就等于它的各位非0的 ...

  10. Java实现 蓝桥杯VIP 算法提高 3-2求存款

    算法提高 3-2求存款 时间限制:1.0s 内存限制:256.0MB 问题描述 见计算机程序设计基础(乔林)P50第5题. 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比格式表示的利率,计 ...