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: ...
随机推荐
- C++语法小记---函数重载
函数重载 函数重载的本质是对已有功能的扩展 构成重载的三大条件 函数名相同 参数列表不通(与返回值无关) 重载函数的作用域相同 成员函数之间可以重载,成员函数和静态成员函数之间可以构成重载,全局函数之 ...
- Winform开发中的困境及解决方案
在我们开发各种应用的时候,都会碰到很多不同的问题,这些问题涉及架构.模块组合.界面处理.共同部分抽象等方面,我们这里以Winform开发为例,从系统模块化.界面组件选择.业务模块场景划分.界面基类和辅 ...
- 图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录)
图书馆管理系统程序+全套开发文档(系统计划书,系统使用说明,测试报告,UML分析与设计,工作记录): https://download.csdn.net/download/qq_39932172/11 ...
- java基础(七)--基本类型转换
一.转换规则 1.类型转换的原则是: 小容量可以自动转成大容量,大容量转成小容量,需要强制转换,有些类型之前不能转换 判断以下语句是否符合要求 2.默认的识别数字 整数默认->int 浮点数默认 ...
- Java开发环境配置之安装JDK
一:序言摘要 学习过Java的人都知道,如果想要开发一套java程序,首先需要做的准备工作就是配置JDK.JDK是 Java 语言的软件开发工具包,它主要用于移动设备.嵌入式设备上的java应用程序. ...
- Linux重定向用法详解
大家好,我是良许. 相信大家平时都会有需要复制粘贴数据的时候,如果是打开文件进行复制粘贴,就不可避免的需要较多的鼠标与键盘的操作,就会比较繁琐.那么有没有可以省掉这些繁琐操作的复制粘贴的方法呢? 答案 ...
- sublimeCLang配置报错以及sublime快捷键
subimeClang需要手动配置我真的真的很服 记录一下满是报错的高光时刻 -------- 不过这个问题刚刚解决了 只要把所有的shared_ptr改成std::shared_ptr 就行 说白了 ...
- JavaScript高级程序设计(第三版) 5/25
第三章 基本概念 1.任何语言的核心都必然会描述这门语言最基本的工作原理.而描述的内容通常都要涉及这门语言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念. 2.浮点数值,该数值中必 ...
- Python file() 函数
描述 file() 函数用于创建一个 file 对象,它有一个别名叫 open(),更形象一些,它们是内置函数.参数是以字符串的形式传递的.每组词 www.cgewang.com 更多文件操作可参考: ...
- PHP 太空船运算符(组合比较符)
PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于.等于或大于 $b时,它分别返回-1.0或1. 实例 <?php // 整型比较 print( ...