过滤和排序(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. python学习之scipy实战1(积分用法)

    import numpy as np def main(): #1-- Integral积分 from scipy.integrate import quad, dblquad, nquad prin ...

  2. Linux企业常用命令详解

    cat :查看 cat [-AbeEnstTuv] [--help] [--version] fileName 常用参数: -n :由 1 开始对所有输出的行数编号 -b :和 -n 相似,对于空白行 ...

  3. CodeGym-17~20

    读文章 0.如果是基本数据类型的话,在数组中就存储特定的值:如果是对象的话,在数组中就是存储对象的引用. 1.数组本身就是对象 再读文章 0.Arrays.sort(array); Arrays.to ...

  4. 在kali中安装两个版本的python

    在kali中安装两个版本的python 在kali中已经预装了两个版本的python,但是没有装pip(>︿<). 这时使用python或者python3表示python3:使用pytho ...

  5. ssh中pam模块造成认证失败

    由于编译参数增加了pam认证 安装后发现这个模块没启用 vim /etc/ssh/sshd_config UsePAM yes 将这个模块打开后就ok了

  6. ssh端口转发学习笔记

    ssh端口转发学习笔记 ssh命令参数介绍 -C 压缩数据传输 -f 将 ssh 转到后台运行,即认证之后,ssh 自动以后台运行.不在输出信息 -n 将 stdio 重定向到 /dev/null,与 ...

  7. sql server 2000 单主键高效分页存储过程 (支持多字段排序)

    sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [ ...

  8. 12.8 typora快捷键

    Markdown学习 标题: n个#号 字体 粗体:要加粗的字两边加两个** 如 ** 粗体** 斜体:两边一个*号 斜体加粗: 两边三个*号 删除线:两边两个波浪号 引用 github 左边一个大于 ...

  9. 第九届蓝桥杯 C组 Java 等腰三角形

    目录 题目 解答 题目 题目描述 本题目要求你在控制台输出一个由数字组成的等腰三角形. 具体的步骤是: 1. 先用1,2,3,...的自然数拼一个足够长的串 2. 用这个串填充三角形的三条边.从上方顶 ...

  10. Redis 常见的性能问题都有哪些?如何解决?

    Redis 常见的性能问题都有哪些?如何解决? Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最 ...