DRF的过滤类

drf过滤器在filters模块中,主要有四个类
  1. BaseFilterBackend:过滤基类,留好占位方法待后续继承
  2. SearchFilter:继承BaseFilterBackend
  3. OrderingFilter:继承BaseFilterBackend
  4. DjangoObjectPermissionsFilter:继承BaseFilterBackend,3.9版本之后废除
 

过滤的使用

DRF通用列表视图的默认行为是返回一个模型的全部queryset
比如说模型存储了1W条数据,默认会将1W条全部取出,如果不想一次性取出,只需要其中的一部分,需要对查询的结果进行过滤
如果继承了GenericAPIView及以上的视图类,有派生出的 get_queryset方法只需在视图中重写.get_queryset()方法
示例1-根据模型字段进行过滤
# 继承的ModelViewSet
class GetInfoLIst(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserSerializer
# 重写过滤方法
def get_queryset(self):
# 获取当前用户username
username = self.request.user.username
# 过滤出与当前用户username一致的信息
return UserInfo.objects.filter(username=username)
示例2-根据url路径进行过滤
#路由
path('user/<str:username>/', UserList.as_view()),
 
# views
# url示例: 127.0.0.1:8000/user/username/
class UserList(ListAPIView):
serializer_class = UserSerializer def get_queryset(self):
# 获取请求路由中的username
username = self.kwargs['username']
return UserInfo.objects.filter(username=username)
示例3-根据url携带参数进行过滤
#url 示例:127.0.0.1:8000/user/?username=xxxx
# 继承的ModelViewSet
class GetInfoLIst(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserSerializer
# 重写过滤方法
def get_queryset(self):
#从url参数中获取username,如果没有则是None
# query_params.get是从url获取参数的方法
username = self.request.query_params.get('username',None)
if username is None:
return UserInfo.object.all()
else:
return UserInfo.objects.filter(username=username)
 

DRF三种过滤的工具

DjangoFilterBackend
#安装
pip3.9 install django-filter #注册
INSTALLED_APPS = [
'django_filters',
]
过滤配置-全局
与权限配置一样,过滤也分全局过滤配置和局部过滤配置
REST_FRAMEWORK = {
# 全局过滤配置
'DEFAULT_FILTER_BACKENDS':
# 值是元组,将django_filters配置上,进行全局性的过滤
('django_filters.rest_framework.DjangoFilterBackend',) }
过滤配置-局部
from django_filters.rest_framework import DjangoFilterBackend #导包
class UserList(ListAPIView):
# 视图级别过滤
filter_backends = (DjangoFilterBackend,)# 指定后端
字段过滤
from django_filters.rest_framework import DjangoFilterBackend #导包
class UserList(ListAPIView): filter_backends = (DjangoFilterBackend,) # 指定后端
filterset_fields = ('username','id') #要过滤的字段 '''
将为指定的字段自动创建一个 FilterSet 类
可以发送类似请求: http://xxxx/api/xxx?username=xxxx&id=xxxx
Django-filter模块的默认模式是完全匹配模式,需要自定义匹配模式参考https://django-filter.readthedocs.io/en/latest/index.html
'''
 
SearchFilter搜索过滤
SearchFilter 类是DRF自带的过滤器,支持基于简单的单个查询参数的搜索,并且基于Django admin的搜索功能
from rest_framework import filters

class UserList(ListAPIView):
filter_backends = (DjangoFilterBackend,filters.SearchFilter) # 指定后端
# 视图中设置了 search_fields 属性时,才会应用 SearchFilter 类
# search_fields只支持文本类型字段,例如 CharField 或 TextField
search_fields = ('username',) '''
在url中默认的搜索参数是search
url示例 - http://xxxx/api/users?search=木子
会过滤出username=木子的信息
'''
修改url中的搜索参数
# 上述默认以及search字段进行搜索,如果想要修改默认的search字段
REST_FRAMEWORK = {
# 全局过滤配置
'DEFAULT_FILTER_BACKENDS':
# 值是元组,将django_filters配置上,进行全局性的过滤
('django_filters.rest_framework.DjangoFilterBackend',)
# 修改search_fields链接搜索时的字段
"SEARCH_PARAM":"find" }
"""
url示例 - http://xxxx/api/users?find=木子 """
匹配模式
默认情况下,搜索不区分大小写,并使用部分匹配的模式
可以同时有多个搜索参数,用空格和/或逗号分隔
如果使用多个搜索参数,则仅当所有提供的模式都匹配时才在列表中返回对象
可以通过在 search_fields 前面添加各种字符来限制搜索行为
  1. ^ 以指定内容开始
  2. = 完全匹配
  3. @ 全文搜索(目前只支持Django的MySQL后端)
  4. $ 正则搜索
search_fields = ('=username') # 用户名必须完全一致,不能局部一致
OrderingFilter排序
OrderingFilter 类支持简单的查询参数,以控制查询集的元素顺序
class UserList(ListAPIView):
filter_backends = (filters.OrderingFilter) # 指定后端
ordering_filter = ('username',) # 指定可以排序的字段
ordering_fields = '__all__' # 所有字段,和指定二选一 '''
url中的查询参数默认ordering
http://xxxx/api/user?ordering=username
和search一样,如果要修改默认的查询参数,可以通过 ORDERING_PARAM指定
'''
#排序
http://xxxx/api/user?ordering=username # 默认排序
http://xxxx/api/user?ordering=-username #反向排序
http://xxxx/api/user?ordering=username,age #多个字段进行排序

指定默认的排序方式

class UserList(ListAPIView):
filter_backends = (filters.OrderingFilter) # 指定后端
ordering_filter = ('username',) # 指定可以排序的字段
ordering = ('username') #默认初始用username排序

46.drf过滤、搜索、排序的更多相关文章

  1. drf过滤和排序及异常处理的包装

    过滤和排序(4星) 查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView 内置过滤类 内置过滤类使用,在视图类中配置,是模糊查询 使用 ...

  2. DRF:过滤&搜索&排序功能

    过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters 示例代码如下: from rest_framework import filt ...

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

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

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

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

  5. [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能

      感谢eoe社区的分享   最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...

  6. Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

    转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...

  7. Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)

    一.先摆需求: 1.中文搜索.英文搜索.中英混搜   如:"南京东路","cafe 南京东路店" 2.全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜   如 ...

  8. 学习ASP.NET Core(08)-过滤搜索与分页排序

    上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志:本章我们将介绍过滤与搜索.分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的使用 ASP.NET Core 3 ...

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

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

随机推荐

  1. Java Web中MVC设计模式与IOC

    MVC是由Model(模型).View(视图).Controller(控制器)三个模块组成 视图:用于做数据展示以及和用户交互的一个界面(html页面) 控制层:能够接受客户端的请求,具体的业务功能还 ...

  2. 三 单例模式【Singleton Pattern】  来自CBF4LIFE 的设计模式

    这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...

  3. VM虚拟机安装

    VM虚拟机安装 1.安装vm虚拟机软件 1.1 双击打开虚拟机文件 1.2 根据向导安装 下一步 安装好了 不要着急点完成在 安装目录中有许可证. 1.3激活操作 2.虚拟机原理简介 3. 新建虚拟机 ...

  4. 食之无味?App Startup 可能比你想象中要简单

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  5. KingbaseES R6 集群repmgr.conf参数'recovery'测试案例(三)

    案例三:测试'recovery = manual' 1.查看集群节点状态信息: [kingbase@node1 bin]$ ./repmgr cluster show ID | Name | Role ...

  6. Sys_Bulkload 工具使用

    一.介绍 sys_bulkload是KingbaseES提供的快速加载数据的命令行工具.用户使用sys_bulkload工具能够把一定格式的文本数据简单.快速的加载到KingbaseES数据库中,或将 ...

  7. Mac_mysql_密码重置

    1 通过Mac 的设置 stop mysql 2 跳过权限认证 // 进入数据库指令文件 cd /usr/local/mysql/bin // 跳过权限认证 sudo ./mysqld_safe -- ...

  8. 往harbor上传镜像

    下载镜像并给镜像打tag [root@hdss7-200 harbor]# docker pull nginx:1.7.9 [root@hdss7-200 harbor]# docker images ...

  9. 深度剖析Istio共享代理新模式Ambient Mesh

    摘要:今年9月份,Istio社区宣布Ambient Mesh开源,由此引发国内外众多开发者的热烈讨论. 本文分享自华为云社区<深度剖析!Istio共享代理新模式Ambient Mesh>, ...

  10. vue项目使用.env文件配置全局环境变量

    一.env文件的认识: (1).env 文件主要的作用是存储环境变量,也就是会随着环境变化的东西,比如数据库的用户名.密码.缓存驱动.时区,还有静态文件的存储路径之类的.因为这些信息应该是和环境绑定的 ...