DRF内置过滤组件与排序组件结合使用
DRF内置过滤组件Filtering
DRF提供了内置过滤组件Filtering,可以结合url路径的改变获取想要的数据,当然用户不可能在url访问路径中自己设置过滤条件,肯定是后端开发人员将前端页面中的与某些数据提示信息挂钩的按钮(点击事件)跟url路径中设置的检索条件绑定在一起,用户只要按需求点击相应按钮,即可获取想要的数据资源。
django-filter
一、通过django-filter增强支持:
pip install django-filter
二、在 settings.py 配置文件中增加过滤后端的设置:
# 需要将django-filter以应用的形式进行注册
INSTALLED_APPS = [
...
'django_filters',
]
REST_FRAMEWORK = {
...
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
三、在视图中添加filter_fields属性,指定可以过滤的字段
from rest_framework.generics import ListAPIView
class StudentListView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 指定按照'age'和'sex'字段的不同值展示相应的数据
filter_fields = ('age', 'sex')
四、url路径设置过滤字段的值
# 在所有学生信息数据中过滤出性别为男生的数据即'sex=1':
127.0.0.1:8000/four/students/?sex=1
# 在所有学生信息数据中过滤出年龄为18岁的数据即'age=18':
127.0.0.1:8000/four/students/?age=18
DRF内置排序组件OrderingFilter
在展示列表数据时,DRF提供了OrderingFilter过滤器来帮助我们将展示的所有数据按照指定字段值的大小进行排序。
一、使用方法:
在类视图中设置filter_backends 属性,使用rest_framework.filters.OrderingFilter过滤器,DRF会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序后展示。
前端可以传递的ordering参数的可选字段值需要在ordering_fields属性中指明。
示例:
from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter
class StudentListView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
#
filter_backends = [OrderingFilter,]
# 指明按照'id'和'age'字段的值的大小对数据进行排序后展示
ordering_fields = ('id', 'age')
url路径中设置按照指定字段排序的排序方式(倒序/升序)
# 必须是ordering = 某个值
# 'ordering=-id'即表明将所有学生信息数据按照ID值的大小倒序展示
127.0.0.1:8000/four/students/?ordering=-id
# 'ordering=-age '即表明将所有学生信息数据按照年龄大小倒序展示
127.0.0.1:8000/four/students/?ordering=-age
过滤 & 排序结合使用
如果需要过滤以后再次进行排序,则需要两者结合!
示例如下:
from rest_framework.generics import ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
# 需要使用'DjangoFilterBackend'才能结合使用
from django_filters.rest_framework import DjangoFilterBackend
class Student3ListView(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentModelSerializer
# 指定按照'age'和'sex'字段的不同值展示相应的数据
filter_fields = ('age', 'sex')
# 因为'filter_backends'是局部过滤配置,局部配置会覆盖'settinigs.py'文件中的全局配置,所以需要再次声明过滤组件核心类'DjangoFilterBackend',否则过滤功能会失效
filter_backends = [OrderingFilter, DjangoFilterBackend]
# 指明按照'id'和'age'字段的值的大小对数据进行排序后展示
ordering_fields = ('id', 'age')
访问该接口时若不设置二者结合使用的条件
即:http://127.0.0.1:8080/CAPIView/students/
数据展示如下:
Students Capi
GET /CAPIView/students/
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"id": 2,
"name": "雄霸a",
"sex": true,
"age": 40,
"class_null": "8",
"description": "三分归元气"
},
{
"id": 6,
"name": "aaaaa",
"sex": true,
"age": 20,
"class_null": "",
"description": null
},
{
"id": 7,
"name": "1234",
"sex": true,
"age": 18,
"class_null": "",
"description": "hello666"
},
{
"id": 8,
"name": "1234",
"sex": true,
"age": 30,
"class_null": "0",
"description": "ndjskkvp"
},
{
"id": 11,
"name": "查询接口",
"sex": false,
"age": 23,
"class_null": "10",
"description": "春风十里"
},
{
"id": 12,
"name": "你好啊",
"sex": false,
"age": 34,
"class_null": "1",
"description": "就开始看看"
},
{
"id": 13,
"name": "我去啊",
"sex": false,
"age": 10,
"class_null": "9",
"description": "这个drf提供的封装好的视图子类真牛逼,我服了"
}
]
当url路径中设置二者结合使用的条件
即:http://127.0.0.1:8080/CAPIView/students/?sex=1&ordering=-age
# 先过滤出性别为男生的数据再按照年龄倒序展示
127.0.0.1:8000/books/?sex=1&ordering=-age
数据展示如下:
Students Capi
GET /CAPIView/students/?sex=1&ordering=-age
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"id": 2,
"name": "雄霸a",
"sex": true,
"age": 40,
"class_null": "8",
"description": "三分归元气"
},
{
"id": 8,
"name": "1234",
"sex": true,
"age": 30,
"class_null": "0",
"description": "ndjskkvp"
},
{
"id": 6,
"name": "aaaaa",
"sex": true,
"age": 20,
"class_null": "",
"description": null
},
{
"id": 7,
"name": "1234",
"sex": true,
"age": 18,
"class_null": "",
"description": "hello666"
}
]
当二者结合使用时,就可以先过滤后再进行排序的展示数据了,感觉挺好用的
DRF内置过滤组件与排序组件结合使用的更多相关文章
- DRF内置认证组件之自定义认证系统
自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...
- DRF内置权限组件之自定义权限管理类
DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...
- Vue源码后记-其余内置指令(1)
把其余的内置指令也搞完吧,来一个全家桶. 案例如下: <body> <div id='app'> <div v-if="vIfIter" v-bind ...
- python学习笔记:第14天 内置函数补充和递归
一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...
- Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2.6.更新 ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
- python(day16)内置函数,匿名函数
# add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...
- python高级(二)—— python内置序列类型
本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...
- 内置函数:sorted 用法
内置函数——sorted 对list.dict进行排序,Python提供了两个方法 对给定的List L进行排序,方法1: 用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2: ...
随机推荐
- 设计模式:proxy模式
目的:为其他对象提供一种代理以控制对这个对象的访问 理解:尽管Decorator的实现部分与代理相似,但Decorator的目的不一样.Decorator为对象添加一个或多个功能,而代理则控制对对象的 ...
- SpringBoot + Spring Cloud Consul 服务注册和发现
什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式" ...
- 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...
- methodology of english learning
classify the vocabulary into different catigories syllabus about person
- oracle 误删除 恢复
select * from LFS_WELFAxxxxxASTDAYS AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '100' MINUTE) order by ...
- mysql 格式化保存
win -e 'SELECT * from t_share_template;' | sed 's/\t/,/g' > aa.csv
- ubuntu的docker安装
安装docker 安装 介绍一下docker 的中央仓库们 Docker官方中央仓库: https://hub.docker.com/ 因为docker 网站在国外所以访问速度和你的运气有关还有网络. ...
- 7.1 NOI模拟赛 计数问题 dp
还是可以想出来的题目 不过考场上没有想出来 要 引以为戒. 初看觉得有点不可做 10分给到了爆搜. 考虑第一个特殊情况 B排列为1~m. 容易发现A排列中前m个数字 他们之间不能产生交换 且 第k个数 ...
- ZROI 提高十连测 DAY3
由于我不太会写 觉得从比赛开始就冷静分析.然后看完三道题心态有点爆炸没有紧扣题目的性质. 这个心态是不可取的尽量不要有畏难心理 不要草草的写暴力. LINK:[最长01子序列](http://zhen ...
- ABC 158 F - Removing Robots dp 单调栈
LINK:Removing Robots 没想到 自闭. 考虑了一个容斥 发现不合法方案难以计算. 就算可以计算也几乎是n^2的做法. 考虑dp 左边会对右边产生影响 所以考虑先dp右边的再考虑左边的 ...