46.drf过滤、搜索、排序
DRF的过滤类
- BaseFilterBackend:过滤基类,留好占位方法待后续继承
- SearchFilter:继承BaseFilterBackend
- OrderingFilter:继承BaseFilterBackend
- DjangoObjectPermissionsFilter:继承BaseFilterBackend,3.9版本之后废除
过滤的使用
示例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搜索过滤
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=木子的信息
'''
# 上述默认以及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=木子
"""
- ^ 以指定内容开始
- = 完全匹配
- @ 全文搜索(目前只支持Django的MySQL后端)
- $ 正则搜索
search_fields = ('=username') # 用户名必须完全一致,不能局部一致
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过滤、搜索、排序的更多相关文章
- drf过滤和排序及异常处理的包装
过滤和排序(4星) 查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView 内置过滤类 内置过滤类使用,在视图类中配置,是模糊查询 使用 ...
- DRF:过滤&搜索&排序功能
过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters 示例代码如下: from rest_framework import filt ...
- Django(67)drf搜索过滤和排序过滤
前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤. 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进行升序排列,就可以 ...
- drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页
签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: ...
- [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能
感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
转载:http://blog.csdn.net/xiaanming/article/details/12684155 转载请注明出处:http://blog.csdn.net/xiaanming/ar ...
- Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)
一.先摆需求: 1.中文搜索.英文搜索.中英混搜 如:"南京东路","cafe 南京东路店" 2.全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜 如 ...
- 学习ASP.NET Core(08)-过滤搜索与分页排序
上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志:本章我们将介绍过滤与搜索.分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的使用 ASP.NET Core 3 ...
- DRF 过滤排序分页异常处理
DRF 中如何使用过滤,排序,分页,以及报错了如何处理?10分钟get了~
随机推荐
- Typora的破解
Typora是什么? Typora是一款支持实时预览的Markdown文本编辑器.支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.即时渲染使得你写Markdown就想是写Word文档 ...
- JDBC的学习 3-1
JDBC的学习 3-1 JDBC基本概念 快速入门 对JDBC中各个接口和类详解 JDBC : 概念 :Java DateBase Connectivity java数据库连接,Java语言操作数据库 ...
- GNSS模块使用笔记
目录 目录 GNSS芯片 NMEA0183 协议 指令 GNSS TO MCU MCU TO GNSS GNSS芯片 ATGM336H-5N31(GPS+BDS双模) 原理图 NMEA0183 协议 ...
- KingbaseES中的参数查看与修改
KingbaseES数据库的配置参数都在kingbase.conf文件中,这些参数有些是直接修改就可以生效,有些需要重启数据库才能生效,而有些根本就不能修改.数据库把这些参数分为以下几类: inter ...
- KingbaseES R3 受限dba影响集群切换
一.受限dba功能说明(参考自官方文档) 受限DBA 受限DBA可以对当前DBA的权限进行一定限制.当功能开启后DBA将不能更改以下对象: Table Database Function(by n ...
- FreeSql 导入数据的各种场景总结 [C#.NET ORM]
前言 导入数据这种脏活.累活,相信大家多多少少都有经历,常见的场景有: 同服务器从A表导数据到B表 批量导入新数据 批量新增或更新数据 跨服务器从A表导数据到B表 每种场景有自己的特点,我们一般会根据 ...
- Hybrid app本地开发如何调用JSBridge
前天同事问我公司内部的小程序怎么对接的,我回忆了一下,简单记录了一下前端同学需要注意的点. 背后还有小程序架构.网络策略等等.当时恰逢小程序架构调整,(老架构的时候我就发现了有一个问题点可以优化,但是 ...
- Java 9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false .回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是. ...
- 华南理工大学 Python第3章课后小测-1
1.(单选)给出如下代码 s = 'Hello scut' print(s[::-1]) 上述代码的输出结果是(本题分数:4)A) HelloB) Hello scutC) olleH tucsD) ...
- void指针;函数指针
void 类型指针 void => 空类型 void* => 空类型指针,只存储地址的值,丢失类型,无法访问,要访问其值,我们必须对这个指针做出正确的 类型转换,然后再间接引用指针.voi ...