过滤和排序(4星)

查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView

内置过滤类

内置过滤类使用,在视图类中配置,是模糊查询 使用前提: 必须继承的顶层类是GenericAPIView

使用方法

设置

from rest_framework.filters import SearchFilter

class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
# 在视图类中配置 最顶层的类至少是GenericAPIView
filter_backends = [SearchFilter, ] # 设置这个
# 过滤条件,按名字过滤
search_fields = ['title', 'price'] # 取决于models里的字段

查询

http://127.0.0.1:8000/books/?search=22   # 书名中或者价格中有22就能查询出来

第三方插件过滤(可以有and关系)

下载模块pip3 install django-filter 并且这个是精准查询 使用前提: 必须继承的顶层类是GenericAPIView

使用方法

注册

INSTALLED_APPS = [
...
'django_filters',
]

设置

from django_filters.rest_framework import DjangoFilterBackend

class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
filter_backends = [DjangoFilterBackend, ] # 写上面导入的类
# 过滤条件,按名字过滤
filter_fields =['name', 'price']

查询

http://127.0.0.1:8000/books/?name=红  # 返回空列表
http://127.0.0.1:8000/books/?name=红楼梦
http://127.0.0.1:8000/books/?name=红楼梦&price=33 # &符号是and关系
http://127.0.0.1:8000/books/?name=红楼梦&price=32 # 返回空列表

自定义过滤类

使用方法

写一个类,继承BaseFilterBackend 基类,重写filter_queryset方法,返回的qs对象,是过滤后的对象 使用前提: 必须继承的顶层类是GenericAPIView

# 在自己创建的untils.py中
from rest_framework.filters import BaseFilterBackend class BookFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
query = request.query_params.get('title')
if query:
queryset = queryset.filter(title__contains=query) # 根据过滤条件筛选数据
return queryset # 在views.py中
from .untils import BookFilter class BookAPIView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
filter_backends = [BookFilter, ] # 设置自定义过滤类 自己定义的过滤类就不需要写类属性了

查询

http://127.0.0.1:8000/books/?title=红  # 模糊匹配 ,自己定义的

源码分析

#### 源码分析----》GenericAPIView----》查询所有,调用了list---》self.filter_queryset(self.get_queryset())----》查看GenericAPIView的filter_queryset方法:
def filter_queryset(self, queryset):
for backend in list(self.filter_backends): # 去视图类里取自定义过滤类名
# 自定义过滤类名实例化得到对象调用filter_queryset方法 而这个就是我们自己写的方法,返回值就是过滤后的数据
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset

内置排序类(既有排序,又有过滤)

使用前提: 必须继承的顶层类是GenericAPIView

使用方法

设置

from rest_framework.filters import OrderingFilter,SearchFilter

class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
filter_backends = [SearchFilter, OrderingFilter]
# 过滤条件,按名字过滤
search_fields = ['title', 'price']
# 按哪个字段排序
ordering_fields = ['price', 'id']

查询

http://127.0.0.1:8000/books/?ordering=price,-id
# 上面这句话的意思是按价格升序,如果遇到相同的,就按id降序

过滤加排序

过滤和排序可以同时用--->因为他们本质是for循环一个个执行,所有优先使用过滤,再使用排序

filter_backends = [SearchFilter,OrderingFilter]
ordering_fields=['price','id']
search_fields=['name','author']

查询

http://127.0.0.1:8000/books/?search=22&ordering=-id

异常处理(4星)

全局统一捕获异常,返回固定的格式 {code:999,msg:'未知错误'}(类似这种格式)

使用方法

在一个新的py文件内:

from rest_framework.views import exception_handler  # 默认没有配置,出了异常会走它
from rest_framework.response import Response
def common_exception_handler(exc, context):
# 取出出错的IP,可以不用
print(context['request'].META.get('REMOTE_ADDR'))
######################################重点##########################################
# exception_handler方法会返回Response对象或者None
res = exception_handler(exc, context)
if res: # 这表示已经处理了异常,它只处理APIExcepiton的异常
res = Response(data={'code': 998, 'msg': res.data.get('detail', '服务器异常')})
else: # 返回None,表示是出了不知道的异常
res = Response(data={'code': 999, 'msg': str(exc)})
# 注意:在这里,可以记录日志---》只要走到这,说明程序报错了,记录日志,以后查日志---》尽量详细
# 出错时间,错误原因,哪个视图类出了错,什么请求地址,什么请求方式出了错
request = context.get('request') # 这个request是当次请求的request对象
view = context.get('view') # 这个viewt是当次执行的视图类对象
# 下面的打印只是举例让你看日志的大概数据
print('错误原因:%s,错误视图类:%s,请求地址:%s,请求方式:%s' % (str(exc), str(view), request.path, request.method))
return res

配置文件配置:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'app01.untils.common_exception_handler'
}

源码分析

drf过滤和排序及异常处理的包装的更多相关文章

  1. drf权限,频率,过滤,排序,异常处理

    目录 一.权限 1 权限源码分析 2 自定义权限类 3 内置权限类 二.频率 1 内置频率设置 三.过滤 四.排序 五.异常处理 一.权限 1 权限源码分析 # APIView---->disp ...

  2. DRF 过滤排序分页异常处理

    DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~

  3. django-rest-framework 基础四 过滤、排序、分页、异常处理

    django-rest-framework 基础四 过滤.排序.分页.异常处理 目录 django-rest-framework 基础四 过滤.排序.分页.异常处理 1. 过滤 1.1 内置过滤类 1 ...

  4. drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页

    签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: ...

  5. Django(67)drf搜索过滤和排序过滤

    前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...

  6. drf--搜索、过滤、排序组件

    目录 drf--搜索.过滤.排序组件 过滤 DjangoFilterBackend 自定义过滤器django-filter模块 自定义过滤类 搜索SearchFilter 排序OrderingFilt ...

  7. ModelViewSet里的过滤、排序、分页、序列化设置

    1.DRF初始化 1.认证 2.权限 3.限流 4.序列化 5.分页 6.版本  7.过滤 8.排序 1.1安装DjangoRestFramework pip install djangoresfra ...

  8. 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView

    背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

随机推荐

  1. 『现学现忘』Docker基础 — 27、Docker镜像的commit操作

    目录 1.commit命令作用 2.commit命令说明 3.示例演示 1.commit命令作用 在运行的容器中,并在镜像的基础上做了一些修改,我们希望保存起来,封装成一个新的镜像,方便我们以后使用, ...

  2. 6月4日 python学习总结 初次接触jQuery

    1. jQuery是什么?是一个轻量级的,兼容多浏览器的JS库(write less, do more) 1. 是一个工具,简单方便的实现一些DOM操作 2. 不用jQuery完全可以,但是不明智. ...

  3. 利用Redis对批量数据实现分布式锁

    需求背景 在开发的收入结转平台界面上有一个归集按钮,可以实现抓取结转表里面的多条数据进行归集操作.为了防止多人多电脑同时操作一条数据,我们自己开发了一个简单的基于Redis实现的分布式锁. 代码实现 ...

  4. Java基础 (上)

    基础概念与常识 Java 语言有哪些特点? 简单易学: 面向对象(封装,继承,多态): 平台无关性( Java 虚拟机实现平台无关性): 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操 ...

  5. JavaScript day03 循环

    循环 while循环 循环是重复性做一件事情 没有办法控制每次循环的时间长度 循环会增大程序时间复杂度(不建议无限循环嵌套 一般情况下不会嵌套超过两次) 死循环 是不会停止的循环 会导致电脑内存溢出 ...

  6. 在Windows11使用WSA运行Google play会遇到的问题

    前提一是要有adb工具 网盘链接:https://pan.baidu.com/s/1MAdq4GsxkW7dqq689d_gQw 提取码:24q2 前提二是会使用 MagiskOnWSA--解决了两个 ...

  7. 把项目发布到tomcat中的方式

    1.相对路径方式1:把项目index.html放在tomcat的webapps/ROOT下,浏览器访问地址:http://www.aaa.com:8080/index.html 2.相对路径方式2:在 ...

  8. 解决IDEA的maven项目 添加依赖后Reimport无反应

    解决IDEA的maven项目 添加依赖后Reimport无反应   如果重启项目和编译器都不管用的话, 找到项目在硬盘上的位置  把该项目的.idea文件夹和xxx.iml文件删除    打开IDEA ...

  9. Mybatis框架基础入门(三)--Mapper动态代理方式开发

    使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类,此方式开发Dao,存在以下问题: Dao方 ...

  10. synchronized、volatile、CAS 比较?

    1.synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞. 2.volatile 提供多线程共享变量可见性和禁止指令重排序优化. 3.CAS 是基于冲突检测的乐观锁(非阻塞)