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: ...
随机推荐
- #python自动化测试#代码执行时间测量模块timeit
1. timeit模块timeit模块可以用来测试一小段python代码的执行速度 class timeit.Timer(stmt = 'pass',setup = 'pass',timer=< ...
- Ubuntu Server 19.04配置静态IP
这个/etc/netplan下默认有个文件50-cloud-init.yaml,直接修改它就行了 sudo vim /etc/netplan/50-cloud-init.yaml 网口名字enp0s3 ...
- 基于Python爬虫采集天气网实时信息
相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10- ...
- Socket通信,基本方法介绍
Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口. 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口 ...
- 安装fiddler 谷歌插件
移动 .crx 插件无法安装问题 解决方案: 修改后缀名为 .zip 文件 进行解压后,使用浏览器扩展程序加载已解压的文件进行扩展 添加插件 2020-06-20
- PHP defined() 函数
实例 检查某常量是否存在: <?phpdefine("GREETING","Hello you! How are you today?");echo de ...
- 通过缓存Cache记录命中率
import org.apache.juli.logging.Log; /** * 通过此Cache记录命中率 * @author Administrator * */ public class Lo ...
- MyBatis辟邪剑谱
一 MyBatis简介 MyBatis是一个优秀的持久层框架 它对JDBC操作数据库的过程进行封装 开发者只需要关注SQL本身 而不需要花费精力去处理JDBC繁杂的过程代码 MyBatis将要执行的各 ...
- log4net用法实例
内容转载自:https://www.cnblogs.com/youring2/archive/2011/04/27/2030424.html 1.引用log4net.dll 2.在AssemblyIn ...
- 华为云GaussDB(DWS)内存知识点,你知道吗?
前言 在日常数据库的使用中,难免会遇到一些内存问题.此次博文主要向大家分享一些华为云数仓GaussDB(DWS)内存的基本框架以及基本视图的使用,以便遇到内存问题后可以有一个基本的判断. 注意,本篇博 ...