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.hqwc.cn/news/305662.html

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

相关文章

【快速全面掌握 WAMPServer】04.人生初体验

网管小贾 / sysadm.cc 我们在前面的教程中为小伙伴们详细地介绍了 WampServer 的安装方法,相信大家对于如何安装应该已经有了一个比较完全的掌握。 在完全掌握安装方法之后,我们还可以更加便捷地使用我为大家提供的一键安装批处理程序来快速搞定安装部署…

Vue 问题解决

一、问题:TypeError: (0 , _message.default) is not a function 当没有default时,在其他页面import引入的时,必须加{}。 二、问题:Vue前端页面的表格数据总是一行一行的显示 使用Async/Await来解决前端数据一行一行显示的问题。可以将获取部…

磁盘管理 :逻辑卷、磁盘配额

一 LVM可操作的对象:①完成的磁盘 ②完整的分区 PV 物理卷 VG 卷组 LV 逻辑卷 二 LVM逻辑卷管理的命令 三 建立LVM逻辑卷管理 虚拟设置-->一致下一步就行-->确认 echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- -…

如何将弹性公网IP绑定到负载均衡CLB

创建的CLB实例为私网类型,没有公网IP,无法通过公网访问,如果需要让其网站能够通过公网访问,只需要绑定前面创建的EIP即可。 第一步 如果弹性公网IP已经绑定了资源,需要先解绑 第二步 将私网CLB实例绑定到弹性公网IP …

CASAIM与东风日产达成治具开发设计与制造战略合作,共同推进3D打印和三维测量技术在汽车制造中的应用开发

CASAIM与东风日产是长期战略合作伙伴,近期,CASAIM中标东风日产的治具开发设计与制造项目,与东风日产在生产工具和工装治具达成战略合作,充分发挥双方技术优势,共同推进3D打印和三维测量技术在汽车制造中的应用开发和合…

用Python做生信分析--环境配置以哦见状

文章目录 pandas 模块安装方法查看pandas是否安装好,以及版本的查看 numpy 模块安装方法查看numpy是否安装好,以及版本的查看 biopython模块安装方法查看biopython是否安装好,以及版本的查看 jupyter-notebook(我比较喜欢用这个写…

AI产品经理 - 技术课-必须懂的技术

一、AI数据流向技术 1.实时智能调度 二、常用的算法 3.案例:自然语言生成NLG&语音识别 4.虚拟现实&机器学习平台 5.深度学习 5.决策管理系统&生物特征识别技术 6.机器人流程自动化& NLP(自然语言处理)

Springboot使用log4j2日志框架

文章目录 1.pom.xml引入依赖2.配置文件引入log4j2的配置文件3.导入log4j2配置文件4.通过Slf4j注解来使用log.info()等最后 1.pom.xml引入依赖 提示&#xff1a;lombok用于Slf4j注解 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

ROS MoveIt!

MoveIt!是一个用于ROS的开源运动规划库&#xff0c;提供多种功能&#xff0c;包括用于运动规划的快速逆运动学分析、用于操纵的高级算法、机械手控制、动力学、控制器和运动规划。&#xff08;通过提供一个GUI来协助MoveIt!所需的各种设置&#xff0c;它允许使用RViz进行视觉反…

从 Linux Crontab 到 K8s CronJob,定时任务正在经历怎样的变革

作者&#xff1a;黄晓萌(学仁) 背景 Job 表示短周期的作业&#xff0c;定时 Job 表示按照预定的时间运行Job&#xff0c;或者按照某一频率周期性的运行 Job。比如&#xff1a; 许多传统企业使用 Linux 自带的 crontab 来做定时任务的方案&#xff0c;该方案非常简单&#xff…

Lombok遇到的问题

常用的几个注解&#xff1a; Data &#xff1a; 注在类上&#xff0c;提供类的get、set、equals、hashCode、canEqual、toString方法 AllArgsConstructor &#xff1a; 注在类上&#xff0c;提供类的全参构造 NoArgsConstructor &#xff1a; 注在类上&#xff0c;提供类的无参…

SLF4J: Class path contains multiple SLF4J bindings.解决

背景 项目正常运行几年&#xff0c;近期优化调整修复漏洞&#xff0c;依赖升级后cleaninstall 重启发现项目启动失败&#xff0c;访问所有接口都报错404 错误信息 output输出异常信息截图 tomcat 打印异常信息截图 output打印异常信息详情 D:\javaRuanJian\Tomcat\apach…