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

Redis实现滚动周榜|滚动榜单|直播间榜单|排行榜|Redis实现日榜04

上述文章主要探讨了实现滚动榜单的两种方式。第一种方式是同步写n天滚动榜单,但这种方式存在一个严重的缺点:每天都需要编写多个榜单。尽管在实现三天或七天滚动榜单时相对简单,但若要实现近30天的滚动榜单,这种方式显得不够智能。…

API集群负载统计 (100%用例)C卷 (JavaPythonNode.jsC语言C++)

某个产品的RESTful API集合部署在服务器集群的多个节点上, 近期对客户端访问日志进行了采集,需要统计各个API的访问频次, 根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。 RESTful API的由多个层级构成,层级之间使用/连接,如/A/B/C/D这个地址…

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

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

Spring Boot笔记2

3. SpringBoot原理分析 3.1. 起步依赖原理解析 3.1.1. 分析spring-boot-starter-parent 按住Ctrl键,然后点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重…

Mybatis Java API - SqlSession

正如前面提到的,​SqlSession​实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。 SqlSession 类上有超过二十个方法,让我们将它们分成更易理解的组别。 Statement Execution Methods-语…

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

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

Java 代理模式

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

C++ 383. 赎金信 (a b字符串计数比较)

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&…

7天玩转 Golang 标准库之 flag

在编写Golang命令行应用时,flag标准库无疑是一个很有价值的工具。它允许你以各种方式来定义和解析命令行参数。 基础示例:定义与解析参数 若想使用flag标准库,你必须首先定义你希望从命令行接收的参数。下面展示了几种常见的参数类型&#x…

Linux中proc文件系统相关介绍

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