django之drf框架(排序、过滤、分页、异常处理)

排序

排序的快速使用

1.必须是继承GenericAPIView及其子类才能是用排序

导入OrderingFilter类,from rest_framework.filters import OrderingFilter

2.在类中配置类属性

filter_backends=[OrderingFilter]

3.类中写属性

ordering_fields = ['price','id'] # 必须是表的字段
# 按照按照读书的价格和id排序

4.以后在前端,就可以访问

http://127.0.0.1:8000/api/v1/books/?ordering=price  # 按price升序排
http://127.0.0.1:8000/api/v1/books/?ordering=-price  # 按price降序排
http://127.0.0.1:8000/api/v1/books/?ordering=-price,id  # 先按price降序排,在按id升序排

views.py

class BookListView(ViewSet, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [OrderingFilter]ordering_fields = ['price','id']

在这里插入图片描述

继承VPIView写排序

过滤规则自己写

class BookListView(ViewSet, APIView):def list(self, request):# 从请求地址栏中取出用户过滤条件query_params = request.query_params# 分组查咨obj_list = Book.objects.all().order_by(query_params.get('ordering'))# 反序列化ser = BookSerializer(instance=obj_list, many=True)return Response(ser.data)

但是这个只能支持单个条件查询,如果要做多个的话需要一下步骤

class BookListView(ViewSet, APIView):def list(self, request):# 从请求地址栏中取出用户过滤条件query_params = request.query_params# 支持多个条件排序,判断如果','在ordering中就切分if ',' in query_params.get('ordering'):query = query_params.get('ordering').split(',')# 分组查咨obj_list = Book.objects.all().order_by(*query)# 反序列化ser = BookSerializer(instance=obj_list, many=True)return Response(ser.data)

过滤

restful规范中,要求请求地址中带过滤条件,五个接口中,只有查询所有接口需要过滤和排序。

 # 过滤,必须继承GenericAPIView及其子类,才能使用这种方法---》配置过滤类的方式
from rest_framework.filters import SearchFilter
class BookView(ViewSetMixin,ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializer""" 前面配置了权限,认证,频率,这里需要取消掉"""permission_classes = []authentication_classes = []throttle_classes = []# SerchFilter内置的,固定用法,模糊匹配# 就有了过滤功能了,指定哪个字段过滤# search_fields = ['name']  # 可以按名字模糊匹配filter_fields =['name','price']  # 可以按名字模糊匹配或价格模糊匹配# 可以使用的搜索方法1.http://127.0.0.1:8000/api/v1/books/?name=# name只要有红就会搜出来2.http://127.0.0.1:8000/api/v1/books/?search=# name或price中只要有红就会搜出来

使用第三方django-filter实现过滤

安装django-filter

pip install django-filter

# 使用第三方djagno_filter过滤器
from django_filters.rest_framework import DjangoFilterBackend
class BookView(ViewSetMixin, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializer# 第三方过滤器filter_backends = [DjangoFilterBackend]# 就有了过滤功能了,指定哪个字段过滤# filterset_fields = ['price']filterset_fields =['name','price']  # 支持完整匹配 name=红楼梦$price=345# 支持的查询方式
http://127.0.0.1:8000/api/v1/books/?price=33
http://127.0.0.1:8000/api/v1/books/?price=33&name=西游记

自定义过滤类

实现名字模糊匹配,价格精准匹配,价格大于50

定义一个过滤器,继承BaseFileterBackend,重写filter_queryset方法

from rest_framework.filters import BaseFilterBackend
class CommonFilter(BaseFilterBackend):def filter_queryset(self, request, queryset, view):# 在里面实现过滤,返回qs对象,就是过滤后的数据name = request.query_params.get('name')price = request.query_params.get('price')price__gt = request.query_params.get('price__gt')if name:queryset = queryset.filter(name__contains=name)if price:queryset = queryset.filter(price=price)if price__gt:queryset = queryset.filter(price__gt=price__gt)return queryset

views.py

class BookListView(ViewSet, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [CommonFilter]# 不需要写字段,在CommonFilter类中已经写死了

继承APIView的写法

class BookListView(ViewSet, APIView):def list(self, request):name = request.query_params.get('name')price = request.query_params.get('price')price__gt = request.query_params.get('price__gt')queryset = Book.objects.all()if name:queryset = queryset.filter(name__contains=name)if price:queryset = queryset.filter(price=price)if price__gt:queryset = queryset.filter(price__gt=price__gt)ser = BookSerializer(instance=queryset,many=True)return Response(ser.data)

分页

分页只针对查询所有的接口,其他四个接口不需要分页。drf内置了三个分页器,对应三种分页方式,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用。一个接口只能有一种分页方式,不能混合分页方式

基本分页

分页类

from rest_framework.pagination import PageNumberPagination
class CommonPageNumberPagination(PageNumberPagination):# page_size = api_settings.PAGE_SIZE  # 每页大小,一页显示多少条page_size = 2page_query_param = 'page'  # 分页查询,?page=1   ?page=2page_size_query_param = 'size'  # 每页最多显示多少条的查询条件max_page_size = 5  # 每页最多显示多少条# http://127.0.0.1:8888/api/v1/books/?page=2  # 查询第二页,显示2条# http://127.0.0.1:8888/api/v1/books/?page=2&size=99  # 查询第二页,显示99条,但是最多显示只有5条

views.py

from .pagination import CommonPageNumberPagination
class BookListView(ViewSet, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [CommonFilter]pagination_class = CommonPageNumberPagination  # 分页方式只能选一种,不要放在列表里

偏移分页

分页类

from rest_framework.pagination import LimitOffsetPagination
class CommonLimitOffsetPagination(LimitOffsetPagination):default_limit = 2  # 每页大小,一页显示多少条limit_query_param = 'limit'  # 每页显示的条数,查询条数,?limit=100,每页显示100条,如果不传,显示2条offset_query_param = 'offset'  # 偏移量 从第6条开始,拿30条 offset=6&limit=30max_limit = 5  # 每页最多显示多少条

views.py

from .pagination import CommonLimitOffsetPagination
class BookListView(ViewSet, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [CommonFilter]pagination_class = CommonLimitOffsetPagination  # 分页方式只能选一种,不要放在列表里
# http://127.0.0.1:8888/api/v1/books/?limit=4&offset=1 #从第一条开始拿4条数据

游标分页

分页类

from rest_framework.pagination import CursorPagination
class CommonCursorPagination(CursorPagination):cursor_query_param = 'cursor'  # 按游标查询的查询条件page_size = 2  # 每页大概显示多少条ordering = 'id'  # 排序规则,必须是表中字段

views.py

class BookListView(ViewSet, ListAPIView):queryset = Book.objects.all()serializer_class = BookSerializerauthentication_classes = []# filter_backends = [CommonFilter]pagination_class = CommonCursorPagination  # 分页方式只能选一种,不要放在列表里
# 游标分页不能再和排序一起使用了,但是web用的不多,app会用到
# 只能选择上一页,下一页,不能指定跳到某一页,但是速度块,针对量特别大的分页,优势大

异常处理

使用步骤

from rest_framework.response import Response
from rest_framework.views import exception_handler# 自己写个函数,处理drf的异常和自己的异常,以后只要出现异常,都会走到它
def common_exception_handler(exc, context):res = exception_handler(exc, context)if res:# 有就是drf的一场,没有就是自己的异常# data = {'detail': exc.detail}# return Response(data)detail = res.data.get('detail') or 'drf异常,请联系管理员'return Response({'code': 999, 'msg': detail})else:return Response({'code': 888, 'msg': '系统异常,请联系系统管理员:%s' % str(exc)})

views.py

class BookView(ViewSetMixin,APIView):def list(self,request):# 主动抛drf的异常# raise APIException('我是drf异常')# 主动抛非drf异常raise Exception('我是非DRF异常')books = Book.objects.all()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某后台管理系统加密参数逆向分析

前言 在我们日常的渗透中经常会遇到开局一个登录框的情况,弱口令爆破当然是我们的首选。但是有的网站会对账号密码等登录信息进行加密处理,这一步不由得阻碍了很多人的脚步。前端的加解密是比较常见的,无论是 web 后台还是小程序&#xff0c…

k8s之部署kubeadm

master 20.0.0.71(4核8G) docker、kubelet、kubectl、kubeadm、flannel node1 20.0.0.73(最少2核4G) docker、kubelet、kubectl、kubeadm、flannel node2 20.0.0.74(最少2核4G) docker、kubelet、kube…

检查Excel内容是否符合规范

代码一: package com.ly.cloud.config;import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.f…

【MySQL库的操作】

1.库的操作 1.1 创建数据库 语法: create databases [IF NOT EXISTS] 数据库名;注意: [] 是可选项 1.2 创建数据库案例 创建名为 db1 的数据库 create databases db1;说明:当我们创建数据库没有指定字符集和校验规则时,系统…

docker compose 部署 grafana + loki + vector 监控kafka消息

Centos7 随笔记录记录 docker compose 统一管理 granfana loki vector 监控kafka 信息。 当然如果仅仅是想通过 Grafana 监控kafka,推荐使用 Grafana Prometheus 通过JMX监控kafka 目录 1. 目录结构 2. 前提已安装Docker-Compose 3. docker-compose 自定义服…

Go 泛型之泛型约束

Go 泛型之泛型约束 文章目录 Go 泛型之泛型约束一、引入二、最宽松的约束:any三、支持比较操作的内置约束:comparable四、自定义约束五、类型集合(type set)六、简化版的约束形式七、约束的类型推断八、小结 一、引入 虽然泛型是…

Keras多分类鸢尾花DEMO

完整的一个小demo: pandas1.2.4 numpy1.19.2 python3.9.2 import numpy as np import pandas as pd import matplotlib.pyplot as plt from pandas import DataFrame from scipy.io import loadmat from sklearn.model_selection import train_test_split impor…

【MYSQL】MYSQL 的学习教程(十)之 InnoDB 锁

数据库为什么需要加锁呢? 如果有多个并发请求存取数据,在数据就可能会产生多个事务同时操作同一行数据。如果并发操作不加控制,不加锁的话,就可能写入了不正确的数据,或者导致读取了不正确的数据,破坏了数…

MySQL数据库多版本并发控制(MVCC)

在数据库中,并发控制是确保多个事务能够同时执行,而不会导致数据不一致或冲突的关键机制。多版本并发控制(MVCC)是一种流行的并发控制方法,它可以允许多个事务同时读取同一数据项的不同版本,而不会相互阻塞。本文将讨论MVCC的原理…

在 iPhone 手机上恢复数据的 7 个有效应用程序

我们的生活离不开 iPhone。无论我们走到哪里,他们都陪伴着我们,让我们保持联系、拍摄照片和视频,并提供娱乐。与此同时,您将计算机安全地放在办公桌上,不受天气影响,也不受伤害。如果您要在任何地方丢失重要…

【ES】Elasticsearch常见问题与解决(持续更新)

目录 Elasticsearch常见问题 1. 集群健康问题 2. 性能问题 3. 映射问题 4. 分片问题 5. 内存问题 6. 硬件问题 7. 配置问题 8. 安全问题 9. 网络问题 10. 版本不兼容 Elasticsearch日常使用小结 【Q】离线告警,有IP已离线 【Q】统计某个应用的某个索引…

Android 13 - Media框架(28)- MediaCodec(三)

上一节我们了解到 ACodec 执行完 start 流程后,会把所有的 input buffer 都提交给 MediaCodec 层,MediaCodec 是如何处理传上来的 buffer 呢?这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 A…

Java 代理模式

一、代理模式概述 代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式的主要作用是扩展目标…

Linux中proc文件系统相关介绍

proc虚拟文件系统的工作原理 linux 内核是一个非常庞大、非常复杂的一个单独的程序,对于这样一个程序来说调试是非常复杂的。像kernel这样庞大的项目,给里面添加或者修改一个功能是非常麻烦的,因为添加一个功能可能会影响其他已经有的功能。…

3D动态路障生成

3D动态路障生成 介绍设计实现1.路面创建2.空物体的创建3.Create.cs脚本创建 总结 介绍 上一篇文章介绍了Mathf.Lerp的底层实现原理,这里介绍一下跑酷类游戏的动态路障生成是如何实现的。 动态路障其实比较好生成,但是难点在哪里,如果都是平面…

JMeter逻辑控制器之While控制器

JMeter逻辑控制器之While控制器 1. 背景2.目的3. 介绍4.While示例4.1 添加While控制器4.2 While控制器面板4.3 While控制器添加请求4.3 While控制器应用场景 1. 背景 存在一些使用场景,比如:某个请求必须等待上一个请求正确响应后才能开始执行。或者&…

Idea如何从磁盘中应用 下载好的插件流程,安装zip压缩包。

1、将下载的插件文件(通常是一个ZIP文件)复制到IntelliJ IDEA的“plugins”文件夹中。 IDEA版本 2、重启IntelliJ IDEA。 3、在设置窗口中,选择左侧的“Plugins”。 4、选择之前复制到“plugins”文件夹中的插件文件,点击“OK”按…

基于Wenet长音频分割降噪识别

Wenet是一个流行的语音处理工具,它专注于长音频的处理,具备分割、降噪和识别功能。它的长音频分割降噪识别功能允许对长时间录制的音频进行分段处理,首先对音频进行分割,将其分解成更小的段落或语音片段。接着进行降噪处理&#x…

深入理解二分查找算法(一)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C#) Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率 Baume…