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

news2024/11/29 0:38:03

排序

排序的快速使用

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.coloradmin.cn/o/1341299.html

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

相关文章

华为云CCE-集群内访问-根据ip访问同个pod

华为云CCE-集群内访问-根据ip访问同个pod 问题描述:架构如下:解决方法: 问题描述: 使用service集群内访问时,由于启用了两个pod,导致请求轮询在两个pod之间,无法返回正确的结果。 架构如下&am…

Appium+python自动化(七)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 上(超详解)

简介 “千呼万唤始出来,犹抱琵琶半遮面”,经过前边的各项准备工作,终于才把appium这位琵琶女请出来。那么下边就由宏哥给各位看官、小伙伴们和童鞋们来引荐这位美女(帅哥)。这一篇主要是对前边的内容做一个小小的总结&…

功能测试知识超详细总结

一、测试项目启动与研读需求文档 (一) 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所有的问题。督促和协助开发人员尽快地解决程序中的缺陷。帮助项目管理人员制定合理的开发和测试计划。对缺陷进行跟…

远程桌面的3389端口如何修改

远程桌面是windows的一个功能组件,通过这个组件可以远程控制某台电脑的电脑桌面,使用过windows远程桌面的人都清楚,大家都知道3389是远程桌面的默认端口号,如果将这个端口在路由器中映射出去,将极大的增加服务器的风险…

.NET Core NPOI导出复杂Excel

一、引入NPOI NuGet: NPOI GitHub源码地址: GitHub - tonyqus/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM, no interop. 版本说明: NPOI 2.4.1 (注意不同版本可能使用…

elasticsearch-hadoop.jar 6.8版本编译异常

## 背景 重新编译 elasticsearch-hadoop 包; GitHub - elastic/elasticsearch-hadoop at 6.8 编译 7.17 版本时很正常,注意设置下环境变量就好,JAVA8_HOME/.... 编译 6.8 版本时(要求jdk8 / jdk9),出现…

经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构

经典目标检测YOLO系列(一)实现YOLOV1网络(1)总体架构 实现原版的YOLOv1并没有多大的意义,因此,根据《YOLO目标检测》(ISBN:9787115627094)一书,在不脱离YOLOv1的大部分核心理念的前提下,重构一款较新的YOLOv1检测器,来…

毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

文章首先介绍本系统所包含的功能,主要包含六方面功能,之后逐步分享开发过程,其流程如下:点亮灯带(三极管)→调节灯光亮度(PWM)→为系统添加远程控制功能→为系统添加语音识别功能→添…

消防数据监测可视化大屏:守护城市安全的智慧之眼

在数字化时代,数据已经成为决策的关键。特别是在消防领域,快速、准确的数据分析对于及时应对火情、挽救生命财产具有不可估量的价值。为此,消防数据监测可视化大屏应运而生,成为城市安全的守护者。 一、什么是消防数据监测可视化大…

云轴科技海通期货 | 一云多芯信创云平台方案入选上海金融科技优秀解决方案

近日,在上海金融科技产业联盟主办的第五届上海金融科技国际论坛上,上海市地方金融监督管理局、中国人民银行上海总部共同发布了2023年度上海金融科技优秀应用场景及解决方案入选名单,其中云轴科技ZStack联合海通期货申报的“一云多芯信创云平…

centos下docker安装Rocketmq总结,以及如何更换mq端口

默认你已经装好了docker哈 安装docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-composedocker-compose --version成功打印…

MidJourney笔记(9)-daily_theme-docs-describe

/daily_theme 切换 #daily-theme 频道更新的通知。 但我发现在对话框那里,是没有这个命令的: 但官网是有介绍,不知道是不是版本问题还是这个命令已经无效。 但后来,我发现这个命令是要在Midjourney服务对话框那里才有,在我们后面添加的Mid

Redis布隆过滤器BloomFilter

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

Apache OFBiz RCE漏洞复现(CVE-2023-51467)

0x01 产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 0x02 漏洞概述 漏洞成因 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外,在…

DRF从入门到精通六(排序组件、过滤组件、分页组件、异常处理)

文章目录 一、排序组件继承GenericAPIView使用DRF内置排序组件继承APIView编写排序 二、过滤组件继承GenericAPIView使用DRF内置过滤器实现过滤使用第三方模块django-filter实现and关系的过滤自定制过滤类排序搭配过滤使用 三、分页组件分页器一:Pagination&#xf…

python-39-flask+nginx+Gunicorn的组合应用

flask nginx Gunicorn 王炸 1 flasknginxgunicornsupervisor 1.1 myapp.py from flask import Flask app Flask(__name__)app.route("/") def test_link():return "the link is very good"if __name__"__main__":app.run()默认是5000端口…

Java学习——设计模式——创建型模式1

文章目录 创建型模式单例饿汉式懒汉式存在的问题 工厂方法简单工厂模式工厂方法模式抽象工厂模式 创建型模式 关注点是如何创建对象,核心思想是要把对象创建和使用相分离,这样两者能相对独立地变换 包括: 1、工厂方法:Factory Met…

深信服AF防火墙配置SSL VPN

防火墙版本:8.0.85 需提前确认防火墙是是否有SSL VPN的授权,确认授权用户数量 1、确认内外网接口划分 2、网络→SSL VPN,选择内外网接口地址 3、SSL VPN→用户管理→新增一个SSL VPN的用户 4、新增L3VPN资源,类型选择Other&…

在用Vite开发时静态图片放哪里,才能保证显示,不出现找不到资源

在用Vite开发时静态图片放哪里 在用Vite开发时静态图片(资源)放哪里呢 ? 如果你想直接全部显示的那么请你把静态资源放到public目录下面,这样你一打包所有的静态资源都会放到打包根目录下。但是此时你在项目中引用的地址一定要是…

微信小程序登录(生成token,token校验)——后端

写在前面:如果想自己开发微信小程序,需要先到微信小程序官方平台注册账号,地址为:https://mp.weixin.qq.com/wxopen/waregister?actionstep1. 登录流程 其中,开发者服务器就是我们的后端服务器,微信接口服…