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内置过滤组件与排序组件结合使用的更多相关文章

  1. DRF内置认证组件之自定义认证系统

    自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...

  2. DRF内置权限组件之自定义权限管理类

    DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...

  3. Vue源码后记-其余内置指令(1)

    把其余的内置指令也搞完吧,来一个全家桶. 案例如下: <body> <div id='app'> <div v-if="vIfIter" v-bind ...

  4. python学习笔记:第14天 内置函数补充和递归

    一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...

  5. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控

    摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2.6.更新 ...

  6. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  7. python(day16)内置函数,匿名函数

    # add = lambda x,y:x+y # print(add(1,2)) # dic={'k1':10,'k2':100,'k3':30} # def func(key): # return ...

  8. python高级(二)—— python内置序列类型

    本文主要内容 序列类型分类: (1)容器序列.扁平序列 (2)可变序列.不可变序列 列表推导式 生成器表达式 元组拆包 切片 排序(list.sort方法和sorted函数) bisect pytho ...

  9. 内置函数:sorted 用法

    内置函数——sorted  对list.dict进行排序,Python提供了两个方法 对给定的List L进行排序,方法1: 用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2: ...

随机推荐

  1. SpringMVC集成Mybatis

    1.pom.xml中添加引入架包 <dependency> <groupId>mysql</groupId> <artifactId>mysql-con ...

  2. 地图热点 jquery.image-maps.js 的使用

    在我悠闲了几天之后,我们后端给了我个任务,地图热点问题.简单来说,就是后台划出热点区域,设置链接,前端拿到数据渲染页面,显示热点区域.我主要使用了jquery.image-maps.js,并且添加了一 ...

  3. Git的忽略文件

    *.iml.gradle.idea/local.properties/.idea/workspace.xml/.idea/libraries.DS_Store/build/captures.exter ...

  4. CSRF与XSS攻击的原理与防范

    CSRF 1.概念与原理 CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统.例如: 用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网 ...

  5. JAVA基础1(语法)

    一.标识符和关键字 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等. 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,其中不能重复,不能以数字开头,不能是 ...

  6. PHP date_timestamp_set() 函数

    ------------恢复内容开始------------ 实例 设置基于 Unix 时间戳的日期和时间: <?php$date=date_create();date_timestamp_se ...

  7. PHP gd_info - 取得当前安装的 GD 库的信息

    gd_info — 取得当前安装的 GD 库的信息. 语法 array gd_info ( void )高佣联盟 www.cgewang.com 返回一个关联数组描述了安装的 GD 库的版本和性能. ...

  8. PHP zip_entry_read() 函数

    定义和用法 zip_entry_read() 函数从打开的 zip 档案中获取内容.高佣联盟 www.cgewang.com 如果成功,该函数则返回项目的内容.如果失败,则返回 FALSE. 语法 z ...

  9. PHP connection_status() 函数

    实例 返回连接状态: <?phpswitch (connection_status()){高佣联盟 www.cgewang.comcase CONNECTION_NORMAL:$txt = 'C ...

  10. PDOStatement::columnCount

    PDOStatement::columnCount — 返回结果集中的列数.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0) 说明 语法 int PDOStateme ...