当前位置: 首页 > news >正文

PageNumberPagination、LimitOffsetPagination、CursorPagination

数据

from django.db import modelsclass User(models.Model):username = models.CharField(max_length=64, verbose_name='用户名')password = models.CharField(max_length=64, verbose_name='密码')# 用户类型user_type = models.IntegerField(choices=((1, '菜鸟用户'), (2, '普通用户'), (3, '超级用户')), verbose_name='用户级别')# 一对一的关系,关联字段写好之后,要考虑谁拿谁的情况多,最好将用的多的放外键
class UserToken(models.Model):token = models.CharField(max_length=64, verbose_name='随机字符串')user = models.OneToOneField(to=User, on_delete=models.CASCADE)# 也等于# user = models.ForeignKey(to=User, unique=True, on_delete=models.CASCADE)class Book(models.Model):title = models.CharField(max_length=32, verbose_name='书名')price = models.IntegerField(verbose_name='书价')publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)users = models.ManyToManyField(to=User)def publish_detail(self):return {'name': self.publish.name, 'addr': self.publish.addr}def user_list(self):lst = []for user in self.users.all():lst.append({'username': user.username,'password': user.password,'user_type': user.get_user_type_display()})class Publish(models.Model):name = models.CharField(max_length=32, verbose_name='出版社名称')addr = models.CharField(max_length=32, verbose_name='出版社地址')

路由

from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter, SimpleRouterfrom app01.views import BookViewrouter = SimpleRouter()
router.register('books', BookView, 'books')urlpatterns = [path('admin/', admin.site.urls),path('', include(router.urls))
]

序列化类

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from .models import User, UserToken, Book, Publishclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = '__all__'class PublishSerializer(serializers.ModelSerializer):class Meta:model = Publishfields = '__all__'class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['title', 'price', 'publish', 'users', 'publish_detail', 'user_list']extra_kwargs = {'publish': {'write_only': True},'users': {'write_only': True},}publish_detail = serializers.DictField(read_only=True)user_list = serializers.ListField(read_only=True)def validate_users(self, value):if len(value) > 5:raise ValidationError('一本图书的作者最多5个')return valuedef validate(self, attrs):title = attrs.get('title')publish = attrs.get('publish')# 检查 title 和 publish 是否包含敏感信息sensitive_words = ['SB', 'DJB', 'CNM']for word in sensitive_words:if word in title:raise ValidationError('标题包含敏感信息')if word in publish:raise ValidationError('出版社名称包含敏感信息')return attrs

分页 page.py

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination# 继承PageNumberPagination分页
class CommonPageNumberPagination(PageNumberPagination):# 过滤形式# http://api.example.org/accounts/?page=4# http://api.example.org/accounts/?page=4&page_size=100# 需要重写几个类属性page_size = 3  # 每页显示2条page_query_param = 'page'  # 指定第几页的 key 值page_size_query_param = 'size'  # 指定每页显示多少条max_page_size = 5  # 每页最多显示5条# 继承LimitOffsetPagination分页
class CommonLimitOffsetPagination(LimitOffsetPagination):# 过滤形式# http://api.example.org/accounts/?limit=3  从开始取3条# http://api.example.org/accounts/?offset=4&limit=5  从第4条开始取5条default_limit = 2  # 默认每页显示3条limit_query_param = 'limit'  # 每页显示多少条的查询条件offset_query_param = 'offset'max_limit = 5# 继承CursorPagination分页
class CommonCursorPagination(CursorPagination):# 只能上一条和下一条,不能指定跳转到中间的某页----》效率高,大数据cursor_query_param = 'cursor'  # 查询条件,用不到,需要有page_size = 2  # 每页显示2条ordering = 'id'  # 按id排序

视图函数

PageNumberPagination

from rest_framework.generics import GenericAPIView
from rest_framework.response import Responsefrom .models import Book
from .serializer import BookSerializer
from rest_framework.viewsets import ViewSetMixinfrom .page import CommonPageNumberPaginationclass BookView(ViewSetMixin, GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializerpagination_class = CommonPageNumberPaginationdef list(self, request, *args, **kwargs):# 查询所有数据queryset = self.filter_queryset(self.get_queryset())# 分页处理page_list = self.paginate_queryset(queryset)if page_list:ser = self.get_serializer(page_list, many=True)return self.get_paginated_response(data=ser.data)ser = self.get_serializer(queryset, many=True)return Response(ser.data)

LimitOffsetPagination

from .page import CommonLimitOffsetPaginationclass BookView(ViewSetMixin, GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializerpagination_class = CommonLimitOffsetPaginationdef list(self, request, *args, **kwargs):# 获取查询集queryset = self.filter_queryset(self.get_queryset())# 分页处理page_list = self.paginate_queryset(queryset)if page_list:serializer = self.get_serializer(page_list, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

CursorPagination

from .page import CommonCursorPaginationclass BookView(ViewSetMixin, GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializerpagination_class = CommonCursorPaginationdef list(self, request, *args, **kwargs):# 获取查询集queryset = self.filter_queryset(self.get_queryset())# 分页处理page_list = self.paginate_queryset(queryset)if page_list is not None:serializer = self.get_serializer(page_list, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

报错

1.先写个函数
from rest_framework.views import exception_handler
from rest_framework.response import Responsedef common_exception(exc, context):res = exception_handler(exc, context)if not res:return Response({'code': 999, 'msg': f'非drf错误,错误信息是:{str(exc)}'})return Response({'code': 666, 'msg': f'这是drf错误,错误信息是:{res.data.get("detail")}'})2.在配置文件中配置:REST_FRAMEWORK = {# 以后只要除了异常,都会走这个函数'EXCEPTION_HANDLER': 'app01.exceptions.common_exception',
}

相关文章:

PageNumberPagination、LimitOffsetPagination、CursorPagination

数据 from django.db import modelsclass User(models.Model):username models.CharField(max_length64, verbose_name用户名)password models.CharField(max_length64, verbose_name密码)# 用户类型user_type models.IntegerField(choices((1, 菜鸟用户), (2, 普通用户), …...

怎么把视频转换成mp4格式

怎么把视频转换成mp4格式?如今,随着科技的不断发展,我们在工作中接触到的多媒体视频格式也越来越多。其中,MP4作为一种广泛兼容的视频格式,在许多软件中都能轻松播放,并且成为了剪辑与裁剪视频时大家常用的…...

正则判断字符是否包含手机号

字符前后不能是数字,满足手机号标准 String msg "19009098989";String mobliePattern "((?<!\\d))(mobile|手机号|)(|\\[|\\\":\\\"|:|&#xff1a;||:|)(1)([3-9]{1}\\d{1})(\\d{4})(\\d{4})(\\]|\\\"||)((?!\\d))";String mobileR…...

OSCP系列靶场-Esay-Sumo

OSCP系列靶场-Esay-Sumo 总结 getwebshell : nikto扫描 → 发现shellshock漏洞 → 漏洞利用 → getwebshell 提 权 思 路 : 内网信息收集 → 内核版本较老 →脏牛提权 准备工作 启动VPN 获取攻击机IP → 192.168.45.194 启动靶机 获取目标机器IP → 192.168.190.87 信息收…...

本地电脑搭建web服务器、个人博客网站并发布公网访问 【无公网IP】(1)

文章目录 前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在所需环境中安装并运行 生成网页4. “装修”个人网站5. 将位于本地电脑上的网页发布到公共互联网上 前言 在现代社会&#xff0c;网络已经成为我们生活离不开的必需品&#xff0c;而纷繁…...

Python基础List列表定义与函数

如何定义一个非空的列表&#xff1f; name_list ["liming","xiaohong",15,{"hobby":"basketball"}] 列表的特点&#xff1a; 1.列表是有序的 2.可以存放多个元素 3.每个元素可以是任何数据类型 定义一个空列表 name_list [] 访…...

typeScript--[数据定义]

一.安装ts 1.命令行运行如下命令&#xff0c;全局安装 TypeScript&#xff1a; npm install -g typescript2.安装完成后&#xff0c;在控制台运行如下命令&#xff0c;检查安装是否成功 tsc -V 二.创建ts文件 1.创建一个day01.ts文件&#xff0c;随便在里面码一点代码&…...

【常见相机模型】

常见相机模型 enum class Type {kPinhole 0,kUnifiedProjection 1,kOmni 2, //optimize_on_spherekEqFisheye 3};其余类型optimize_on_plane这4种类型的相机模型具有以下差异&#xff1a; kPinhole (针孔相机模型)&#xff1a;这是最基本和常见的相机模型。它假设光线通过…...

大数据-玩转数据-Flink状态编程(上)

一、Flink状态编程 有状态的计算是流处理框架要实现的重要功能&#xff0c;因为稍复杂的流处理场景都需要记录状态&#xff0c;然后在新流入数据的基础上不断更新状态。 SparkStreaming在状态管理这块做的不好, 很多时候需要借助于外部存储(例如Redis)来手动管理状态, 增加了编…...

主动获取用户的ColaKey接口

主动获取用户的ColaKey接口 一、主动获取用户的ColaKey接口二、使用步骤1、接口***重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议***2、请求参数 三、 请求案例和demo1、请求参数例子&#xff08;POST请求&#xff0c;参数json格式&#xff09;2、响应返…...

C#写一个UDP程序判断延迟并运行在Centos上

服务端 using System.Net.Sockets; using System.Net;int serverPort 50001; Socket server; EndPoint client new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号CreateSocket();void CreateSocket() {server new Socket(AddressFamily.InterNetwork, SocketT…...

Kafka核心原理第二弹——更新中

架构原理 一、高吞吐机制&#xff1a;Batch打包、缓冲区、acks 1. Kafka Producer怎么把消息发送给Broker集群的&#xff1f; 需要指定把消息发送到哪个topic去 首先需要选择一个topic的分区&#xff0c;默认是轮询来负载均衡&#xff0c;但是如果指定了一个分区key&#x…...

巨人互动|游戏出海H5游戏出海规模如何?

H5游戏出海是指将H5游戏推广和运营扩展到国外市场的行为&#xff0c;它的规模受到多个因素的影响。本文小编讲一些关于H5游戏出海规模的详细介绍。 1、市场规模 H5游戏出海的规模首先取决于目标市场的规模。不同国家和地区的游戏市场规模差异很大&#xff0c;有些市场庞大而成…...

【爬虫】实验项目三:验证码处理与识别

目录 一、实验目的 二、实验预习提示 三、实验内容 实验要求 基本要求&#xff1a; 改进要求A&#xff1a; 改进要求B&#xff1a; 四、实验过程 基本要求 五、源码如下 六、资料 一、实验目的 部分网站可能会使用验证机制来阻止用户无效登录或者是验证用户不是用程…...

广东成人高考报名将于9月14日开始!

截图来自广东省教育考试院官网* 今年的广东成人高考正式报名时间终于确定了&#xff01; 报名时间&#xff1a;2023年 9 月14—20日 准考证打印时间&#xff1a;考前一周左右 考试时间&#xff1a;2023年10月21—22日 录取时间&#xff1a;2023年12 月中上旬 报名条件: …...

pytorch中文文档学习笔记

先贴上链接 torch - PyTorch中文文档 首先我们需要安装拥有pytorch的环境 conda指令 虚拟环境的一些指令 查看所有虚拟环境 conda info -e 创建新的虚拟环境 conda create -n env_name python3.6 删除已有环境 conda env remove -n env_name 激活某个虚拟环境 activate env…...

element-ui全局导入与按需引入

全局引入 npm i element-ui -S 安装好depencencies里面可以看到安装的element-ui版本 然后 在 main.js 中写入以下内容&#xff1a; import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue;Vue.…...

go 地址 生成唯一索引v2 --chatGPT

问&#xff1a;golang 函数 getIndex(n,addr,Hlen,Tlen) 返回index。参数n为index的上限&#xff0c;addr为包含大小写字母数字的字符串,Hlen为截取addr头部的长度&#xff0c;Tlen为截取addr尾部的长度 gpt: 你可以编写一个函数来计算根据给定的参数 n、addr、Hlen 和 Tlen …...

JSON XML

JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种常用的数据交换格式&#xff0c;用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式&#xff0c;它使用易于理解的键值对的形式表示数…...

2023年MySQL实战核心技术第四篇

七 . 吃透索引&#xff1a;...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...