过滤和排序(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. 1.SQL常用命令

    常用命令 连接命令 (1)conn[ect] 用法: conn 用户名/密码@网络服务名 [as sysdba/sysoper] 当用特权用户身份连接时,必须带上 as sysdba 或是 as sy ...

  2. 面试突击32:为什么创建线程池一定要用ThreadPoolExecutor?

    在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类来说,线程池的创建总共分为两大类:手动方式使用 ThreadPoolExecutor 创建线程池和使用 Ex ...

  3. 微服务8:通信之RPC实践篇(附源码)

    ★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC ...

  4. Ansible的原理与配置

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 Ansible原理 Ansible 是一款开源自动化平台.它是一种简单的自动化语言,能够在Ansible Playbook 中完美地描述 IT 应 ...

  5. oracle报ORA-12154

    环境 [oracle@oracle admin]$ sqlplus -vSQL*Plus: Release 19.0.0.0.0 - Production Version 19.3.0.0.0 问题描 ...

  6. 搭建分布式事务组件 seata 的Server 端和Client 端详解(小白都能看懂)

    一,server 端的存储模式为:Server 端 存 储 模 式 (store-mode) 支 持 三 种 : file: ( 默 认 ) 单 机 模 式 , 全 局 事 务 会 话 信 息 内 存 ...

  7. 搭建nuget服务器(二):制作nuget包

    生成nuget包可以使用nuget.exe或者下载nuget package explorer工具 nuget package explorer 下载地址:https://github.com/NuG ...

  8. 简述 Mybatis 的插件运行原理,以及如何编写一个插件。

    Mybatis 仅可以编写针对 ParameterHandler.ResultSetHandler. StatementHandler.Executor 这 4 种接口的插件,Mybatis 使用 J ...

  9. 字节码增强-learnning

    jvm加载java的过程主要是: 编写java文件->进行java文件的编译->生成.class字节码文件->jvm通过类加载器去加载生成的二进制文件 java编译器将源码文件编译称 ...

  10. jdbc的快速入门(需要mysql-connector-java-5.1.39-bin.jar包)

    package Lianxi;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;i ...