9、DRF实战总结:过滤(filter)与排序,以及第三方库django-filter的使用(附源码)

news2024/12/24 9:34:07

在前面的DRF系列教程中,以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口,并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中将向演示如何在Django REST Framework中对分页结果进行进一步过滤和排序。

DRF的过滤是指根据请求参数来筛选数据的功能,例如根据某个字段的值来过滤数据,或者实现一些复杂的查询条件。DRF提供了多种过滤方式,如基于字段的精确匹配、范围过滤、搜索过滤等。

DRF的排序是指对指定字段进行升序或降序排列的功能。DRF支持多字段排序和自定义排序规则。

参考文章:

3、DRF实战总结:基于类的视图APIView, GenericAPIView和GenericViewSet视图集(附源码)_SteveRocket的博客-CSDN博客

4、DRF实战总结:序列化器(Serializer)、数据验证、重写序列化器方法详解(附源码)_SteveRocket的博客-CSDN博客

https://blog.csdn.net/zhouruifu2015/article/details/129965342

https://blog.csdn.net/zhouruifu2015/article/details/129965353

前面教程中当发送GET请求到/v1/articles?page=2时可以得到下面返回的分页数据列表。现在希望对结果进行进一步过滤,比如返回标题含有关键词django的文章资源列表,本文详细总结了如何使用三种方法在Django REST Framework中对返回的响应数据进行过滤和排序。下一篇将开始介绍Django REST Framework的限流和自定义响应数据格式

DRF的过滤实现方式:DRF提供了FilterBackend接口,可以实现过滤功能。FilterBackend接口包括两个方法:

1. filter_queryset(self, request, queryset, view): 实现具体的过滤逻辑,返回过滤后的queryset对象。

2. get_schema_fields(self, view): 返回用于描述过滤器的元数据。

DRF内置了一些常用的过滤器,如DjangoFilterBackend、SearchFilter、OrderingFilter等,也可以自定义过滤器。

DRF的排序实现方式:DRF提供了OrderingFilter过滤器,可以实现排序功能。OrderingFilter接口继承自FilterBackend,也包括两个方法:

1. filter_queryset(self, request, queryset, view): 实现具体的排序逻辑,返回排序后的queryset对象。

2. get_schema_fields(self, view): 返回用于描述排序方式的元数据。

使用OrderingFilter过滤器时,需要在视图类中定义ordering_fields属性,即允许排序的字段列表。具体使用方式可以参考DRF官方文档。

django-filter是一个Django扩展,提供了方便的过滤数据的功能。它通过定义FilterSet类来实现,可以支持多个过滤条件,包括基于字段的精确匹配、范围过滤、搜索过滤等。django-filter的特点包括:

1. 简单易用:只需要定义FilterSet类并指定需要过滤的字段即可。

2. 定制性强:可以自定义过滤条件和过滤方法。

3. 性能好:通过缓存机制提高过滤性能。

4. 支持复杂查询:可以使用逻辑运算符(与、或、非)来组合多个条件进行复杂查询。

总之,DRF的过滤和排序功能以及django-filter的数据过滤功能可以帮助开发者快速构建强大的API接口,提升数据检索和查询的效率。

重写GenericsAPIViewviewsetget_queryset方法

此方法不依赖于任何第三方包, 只适合于需要过滤的字段比较少的模型。比如这里需要对文章title进行过滤,只需要修改ArticleList视图函数类即可。

# drf_pro/views_filter.py

 

#drf_pro/urls.py

修改好视图类后,发送GET请求到/v1/articles7?q=文章标题, 将得到所有标题含有“文章标题”关键词的文章列表,这里显示一共有1条结果。

当一个模型需要过滤的字段很多且不确定时(比如文章状态、正文等等), 重写get_queryset方法将变得非常麻烦,更好的方式是借助django-filter这个第三方库实现过滤。

使用django-filter

Django-Filter是一个很好的利用了Django ORM特性,非常好用的第三方库,可以使用很少的代码就扩展原有的接口,实现多种筛选功能。

参考文档:django-filter · PyPI

GitHub地址:

GitHub - carltongibson/django-filter: A generic system for filtering Django QuerySets based on user selections

GitHub - carltongibson/django-filter: A generic system for filtering Django QuerySets based on user selections

 django-filter库包含一个DjangoFilterBackend类,该类支持REST框架的高度可定制的字段过滤。推荐使用此过滤方法, 因为它自定义需要过滤的字段非常方便, 还可以对每个字段指定过滤方法(比如模糊查询和精确查询)。具体使用方式如下:

1. 安装django-filter

pip install django-filter

2. INSTALLED_APPS添加django_filters

3. 自定义FilterSet

这里自定义了按标题关键词和文章状态进行过滤。

# drf_pro/filters.py(新建)

4. 将自定义FilterSet类加入到View类或ViewSet

另外同时还需要将DjangoFilterBackend设为过滤后台,如下所示:

# drf_pro/urls.py

 发送GET请求到/v1/articles8/?q=DRF实战总结&status=p将得到如下返回结果,只包含发表了的文章。

还可以看到REST框架提供了一个新的Filters下拉菜单按钮,可以帮助对结果进行过滤(见上图标红部分)。

使用DRF提供的SearchFilter

DRF自带的具有过滤功能的SearchFilter类,其使用场景与Django-filter的单字段过滤略有不同,更侧重于使用一个关键词对模型的某个字段或多个字段同时进行搜索

使用这个类,还需要指定search_fields, 具体使用方式如下:

发送GET请求到/v1/articles9/?search=DRF实战总结, 将得到如下结果。

注意:这里进行搜索查询的默认参数名为?search=xxx。

SearchFilter类非常有用,因为它不仅支持对模型的多个字段进行查询,还支持ForeinKey和ManyToMany字段的关联查询。按如下修改search_fields, 就可以同时搜索标题或用户名含有某个关键词的文章资源列表。修改好后,作者用户名里如果有django,该篇文章也会包含在搜索结果了。

  • search_fields = ('title', 'author__username')

默认情况下,SearchFilter类搜索将使用不区分大小写的部分匹配(icontains)。可以在search_fields中添加各种字符来指定匹配方法。

  1. '^'开始 - 搜索。
  2. '='完全匹配。
  3. '@'全文搜索。
  4. '$'正则表达式搜索。

例如:search_fields = ('=title', )精确匹配title

前面详细介绍了对结果进行过滤的3种方法,接下来再看看如何对结果进行排序,这里主要通过DRF自带的OrderingFilter类实现。

使用DRFOrderingFilter

使用OrderingFilter类首先要把它加入到filter_backends, 然后指定排序字段即可,如下所示:

发送请求时只需要在参数上加上?ordering=create_date或者?ordering=-create_date即可实现对结果按文章创建时间正序和逆序进行排序。

点击DRF界面上的Filters按钮,还会看到搜索和排序的选项。

实际开发应用中OrderingFilter类,SearchFilter类和DjangoFilterBackend经常一起联用作为DRF的filter_backends,没有相互冲突。

代码示例:https://download.csdn.net/download/zhouruifu2015/87657280

输入才有输出,吸收才能吐纳。——码字不易

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/426345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Boost库在windows上的使用

今天要配置一个C环境,被Boost库困扰了一段时间,在这里记录一下解决的方法。 主要是打不开 libboost_iostreams-vc143-mt-gd-x64-1_82.lib这样的问题。 操作的步骤如下: 下载binary包: 链接: https://boostorg.jfrog.io/artifac…

ChatGPT有用到知识图谱吗?它自己是这样回答...

从搜索引擎到个人助手,我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常,知识可以隐式地编码在大型语言模型(LLMs)中,例如ChatGPT、T5 和LaMDA 等大型语言模型,这些模型在未结构…

如何面对人生困境至暗时刻

北方春天伊始刚好想发表下另一种境遇就是当人生面临困境或者至暗怎么样走出来,如果有正面临这样的情况来分享下如何走出阴霾,拥有更多可能性的人生,现在回望过去一年的自己太过牵强失去自我。 对世界的应该思维:为什么我总看不清现…

PHP快速入门10-图像处理,附图像大小调整、旋转、获取颜色等15个常见示例

文章目录前言一、PHP的图像处理1.1 图像处理函数二、 图像处理示例2.1 创建一个空白的图像2.2 从文件创建一个新的图像2.3 从URL创建一个新的图像2.4 调整图像大小2.5 对比度和亮度调整2.6 度数旋转2.7 模糊滤镜2.8 获取图像的颜色信息2.9. 图像合并2.10 图像旋转和裁剪2.11 图…

css补充内容

1.最好给body设置min-width,防止缩小页面时出现空白 2.让图片随着网页缩小而缩小 3.html5语义化元素 4.video与audio video是行内替换元素 默认是第一帧静态画面,需要手动调整画面大小和添加播放条,是否自动播放 大多数浏览器不支持自动播放,除非设置为muted,这是为了用户的…

小巧“抠门”的FTHR-F0140开发板

小巧“抠门”的FTHR-F0140开发板 文章目录小巧“抠门”的FTHR-F0140开发板缘起硬件电路主控芯片供电系统调试器插座LED灯按键CAN接口电路软件资源资源链接缘起 工欲善其事,必先利其器。调试和开发MM32F0140这种小巧的芯片,还是需要小巧的板子去适配&…

本科也可入行的IC模拟版图,需要学习哪些知识?

IC模拟版图是一个入门非常简单,但同时又是一份涉及知识面非常广阔,资深较难的工作。 在众多IC岗位中,模拟版图确实属于容易入门,吸引来很多想要转行IC行业的朋友,但需要掌握的知识点和技巧并不比设计少,属…

Python+Selenium+Unittest 之selenium5--元素定位4-XPath定位1(基本概念)

目录 一、简介 二、节点关系 三、绝对路径与相对路径 一、简介 Xpath定位在selenium中属于常用的定位方式,首先来说下Xpath的一些概念,Xpath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction, ICCV, 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction, ICCV, 2021 一、背景介绍 本篇论文主要提出一种网络…

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签

IT软件行业产品销售渠道多、销售订单体量大&#xff0c;从产品研发、销售到项目实施&#xff0c;伴随着大量的协议、合同、单据需要与员工、客户或者经销商签署。引入电子签章&#xff0c;化解纸质合同签署带来的效率、成本、安全等问题&#xff0c;成为软件行业产品代理、销售…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

ChatGPT自动化提高工作效率: 2分钟快速生成思维导图

一、简要说明 ChatGPT不止是一个聊天机器人&#xff0c;更是一个自然语言处理、文本内容生成模型&#xff0c;它可以理解语言规则&#xff0c;不仅仅是给你输出已有的知识内容&#xff0c;还会给到你一些创意点子&#xff1b;所以我们应该学会如何使用它&#xff0c;让它更好的…

集合例题,

package com.hspedu.homework;import java.util.*;/*** author 韩顺平* version 1.0*/ SuppressWarnings({"all"}) public class Homework03 {public static void main(String[] args) {Map m new HashMap();m.put("jack", 650);//int->Integerm.put(&…

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C标准库-体系结构与内核分析 根据源代码来分析 介绍 自学C侯捷老师的STL源码剖析的个人笔记&#xff0c;方便以后进行学习&#xff0c;查询。 为什么要学STL&#xff1f;按侯捷老师的话来说就是&#xff1a;使用一个东西&#xff0c;却不明白它的道理&#xff0c;不高明&…

分享一个Vue输入框获取焦点自动选中指令

需求背景&#xff1a;最近项目中遇到很多输入类控件&#xff0c;且有频繁改动需求&#xff0c;如果数值过长&#xff0c;则需要一直按着删除键&#xff0c;于是想能不能获取焦点的时候&#xff0c;就直接选中&#xff0c;这样就可以直接删除了 1、思路分析 记得很早的时候做小…

顺序表的实现

思维导图&#xff1a; 一&#xff0c;顺序表 一&#xff0c;顺序表的创建&#xff08;位置&#xff1a;头文件内&#xff09; 1.1顺序表的结构体类型 要求&#xff1a;创建顺序表并使这个顺序表能够存放数据&#xff0c;能记录有效数据的个数&#xff0c;能够记录容量大小。…

记 ==> 首次使用rabbitMQ优化项目

昨天刚学习完了rabbitMQ&#xff0c;刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的。 这个模块大概功能是&#xff1a;用户发送的所有帖子都会添加到他的发件箱&#xff0c;当有个新用户关注了他&#xff0c;他发件箱内所有的博客都会被添加到关注他的用户的收件箱里…

binkw32dll缺失怎么办?如何解决binkw32dll修复问题

binkw32dll缺失怎么办&#xff1f;在使用某些计算机游戏或应用程序时&#xff0c;您可能遇到过binkw32dll缺失的问题。这意味着您的计算机无法找到该DLL文件&#xff0c;从而无法正常运行程序。在本文中&#xff0c;我们将探讨binkw32.dll缺失的可能原因并提供解决方案。 一.什…

python flask 接口平台开发

文章目录descFlaskFlask-SQLAlchemyflasggerdesc 考虑到开发的便捷性、生态的丰富程度&#xff0c;用Flask、Flask-SQLAlchemy、flasgger等编写一套简单易用的接口平台 这里记录以下这几个组件的使用方式 Flask 轻量、灵活&#xff0c;相比Django不用遵循太多的开发规范 F…