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 = BookSerializer
    filter_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 = BookSerializer
    filter_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 = 2
    page_query_param = 'page'  # 分页查询,?page=1   ?page=2
    page_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 = BookSerializer
    filter_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=30
    max_limit = 5  # 每页最多显示多少条

views.py

from .pagination import CommonLimitOffsetPagination
class BookListView(ViewSet, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_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 = BookSerializer
    authentication_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.mfbz.cn/a/276754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用

<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…

YOLOv5改进 | 2023注意力篇 | BiFormer双层路由注意力机制(Bi-level Routing Attention)

一、本文介绍 BiFormer是一种结合了Bi-level Routing Attention的视觉Transformer模型&#xff0c;BiFormer模型的核心思想是引入了双层路由注意力机制。在BiFormer中&#xff0c;每个图像块都与一个位置路由器相关联。这些位置路由器根据特定的规则将图像块分配给上层和下层路…

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

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

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…

算法学习系列(十五):最小堆、堆排序

目录 引言一、最小堆概念二、堆排序模板&#xff08;最小堆&#xff09;三、模拟堆 引言 这个堆排序的话&#xff0c;考的还挺多的&#xff0c;主要是构建最小堆&#xff0c;并且在很多情况下某些东西还用得着它来优化&#xff0c;比如说迪杰斯特拉算法可以用最小堆优化&#…

Xamarin开发:商场促销(策略设计模式)

Xamarin开发:商场促销&#xff08;策略设计模式&#xff09; 一、介绍二、需求分析三、实现四、需求分析问题1解决方案问题2解决方案 五、增加新需求六、代码优化与分析总结 一、介绍 本文引用《大话设计模式》第二章节的内容进行学习分析&#xff0c;仅供学习使用 这里接着我…

Java设计模式-装饰者模式

目录 一、星巴克咖啡订单项目 二、装饰者模式 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;原理 &#xff08;三&#xff09;装饰者模式解决星巴克咖啡订单 一、星巴克咖啡订单项目 星巴克咖啡订单项目&#xff08;咖啡馆&#xff09;&#xff1a; 1) 咖…

菜鸟学习vue3笔记-vue hooks初体验

import { ref } from "vue"; export default function () {let a1 ref(1);let a2 ref(5);let c ref(0);function add() {a1.value;a2.value;}return {add,a1,a2,c,}; }<template><div><p>第一个数字{{ a1 }}</p><p>第二个数字{{ a2…

java勤工助学信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web勤工助学信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为M…

Java线上问题排查思路

1、Java 服务常见问题 Java 服务的线上问题从系统表象来看大致可分成两大类: 系统环境异常、业务服务异常。 系统环境异常&#xff1a;主要从CPU、内存、磁盘、网络四个方面考虑。比如&#xff1a;CPU 占用率过高、CPU 上下文切换频率次数较高、系统可用内存长期处于较低值、…

K8s实战-基于LivenessProbe健康检查

LivenessProbe探针用于判断容器是否存活&#xff0c;如果探测到容器不健康&#xff0c;则kubelet将杀掉该容器&#xff0c;然后根据重启策略处理。 LivenessProbe的实现方式&#xff1a; ExecAction&#xff1a;在容器内部执行一个命令&#xff0c;如果该命令的返回码为0&…

计算机毕业设计 基于SpringBoot的高校危化试剂仓储管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

最短路径(数据结构实训)(难度系数100)

最短路径 描述&#xff1a; 已知一个城市的交通路线&#xff0c;经常要求从某一点出发到各地方的最短路径。例如有如下交通图&#xff1a; 则从A出发到各点的最短路径分别为&#xff1a; B&#xff1a;0 C&#xff1a;10 D&#xff1a;50 E&#xff1a;30 F&#xff1a;60 输…

白话机器学习的数学-1-回归

1、设置问题 投入的广告费越多&#xff0c;广告的点击量就越高&#xff0c;进而带来访问数的增加。 2、定义模型 定义一个函数&#xff1a;一次函数 y ax b &#xff08;a 是斜率、b 是截距&#xff09; 定义函数&#xff1a; 3、最小二乘法 例子&#xff1a; 用随便确定的参…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

文字识别技术在未来会有怎样的发展?

随着科技的不断发展&#xff0c;文字识别技术也在不断地改进和完善。未来&#xff0c;文字识别技术将会在更多的领域得到应用&#xff0c;并且将会更加智能化、高效化和个性化。 首先&#xff0c;随着深度学习技术的不断发展&#xff0c;文字识别技术将会更加智能化。目前&…

ubuntu22下安装minconda

bing 搜索 canda install 找到官方网站 https://docs.conda.io/projects/miniconda/en/latest/ 这里我们安装minconda。 官网有安装方法。 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

docker的基本管理和相关概念

docker的基本管理和概念 docker&#xff1a;开源的应用容器引擎。基于go语言开发的。运行在linux系统当中的开源的&#xff0c;轻量级的“虚拟机” docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可移植的&#xff0c;自给自足的容器 docke…

Java 读取超大excel文件

注意&#xff1a;此参考解决方案只是针对xlsx格式的excel文件&#xff01; Maven <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version> </dependency>读取方式1…

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap,Kotlin

Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap&#xff0c;Kotlin private fun mydraw() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.h…
最新文章