当前位置: 首页 > news >正文

【django开发手册】详解drf filter中DjangoFilterBackend,SearchFilter,OrderingFilter使用方式

  • 💖 作者简介:大家好,我是Zeeland,开源建设者与全栈领域优质创作者。
  • 📝 CSDN主页:Zeeland🔥
  • 📣 我的博客:Zeeland
  • 📚 Github主页: Undertone0809 (Zeeland)
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 💬介绍:The mixture of software dev+Iot+ml+anything🔥

Django系列专栏

  • 【django开发手册】Django 中使用自定义用户模型:一个比自带 User 更强的选择
  • 【django开发手册】如何使用select_related进行一次连表查询
  • 【django开发手册】drf通过添加自定义字段优化DRF序列化器,轻松实现高速API
  • 【django开发手册】解决admin添加外键下拉显示外键的问题
  • 【Django Rest Framework优化实践】ResponseResult、异常处理方法详解
  • 【DRF】深度分析枚举类型在DRF中的序列化问题及解决方案
  • 【django开发手册】关于django admin添加表信息的时候外键无法为空的问题解决方案
  • 【django开发手册】django admin如何显示外键对应的字段
  • 【django开发手册】DRF外键模型查询没有信息?教你实现序列化返回

前言

django restframework filter用于API的filter内容搜索,如对于/user接口,如果你想要查询其username字段,就使用/user/?username=jack的方式进行查询,这种方式就是通过drf的filter模块构建起来的,通过drf封装的filter模块,节约了自己写query代码的工作成本,而其底层本质是drf filter来帮你实现了数据库字段查询的功能,本文将重点介绍如何快速上手构建起drf的filter。

快速上手

首先先附上drf filter相关文档,没有什么比官方文档更加详细的了。

drf主要提供了DjangoFilterBackend,SearchFilter,OrderingFilter三种filter,通过三种不同的过滤器后端类,用于在API视图中实现数据过滤功能。

  1. DjangoFilterBackend:
    DjangoFilterBackend是DRF提供的一个过滤器后端类,它使用第三方库django-filter来执行过滤操作。它允许你根据模型的字段值进行高级过滤,并提供了丰富的过滤选项。你可以通过在视图中指定filter_backends属性为[DjangoFilterBackend]来使用该过滤器后端。

    DjangoFilterBackend做到的事情:

    • 支持通过URL参数进行过滤,例如:/user/?username=jack 这样的 ?field=value 查询方式。
    • 提供了各种过滤选项,如精确匹配、范围查询、日期过滤、外键关联过滤等。
    • 自动生成基于模型定义的过滤表单(FilterSet)。

    使用DjangoFilterBackend可以让你快速、方便地实现复杂的模型字段过滤需求,尤其是当你的过滤器需求比较复杂且需要自定义的时候。

  2. filters.SearchFilter:
    filters.SearchFilter是DRF提供的另一个过滤器后端类,用于执行文本搜索过滤。它基于数据库的全文搜索功能,可以在指定的字段上执行全文搜索,并返回匹配指定搜索词的结果。你可以通过将SearchFilter添加到视图的filter_backends属性列表中来使用它。

    filters.SearchFilter做到的事情:

    • 允许在API请求中通过URL参数指定搜索词,例如:?search=query
    • 支持在指定的字段上进行全文搜索,并返回匹配搜索词的结果。
    • 可以自定义搜索字段、搜索算法和搜索运算符等。

    使用filters.SearchFilter可以轻松地实现基于文本内容的搜索功能,如在文章标题、标签或用户名称等字段上执行搜索。它适用于需求比较简单的文本搜索场景。

  3. filters.OrderingFilter:

    filters.OrderingFilter是DRF提供的另一个过滤器后端类,用于对查询结果进行排序。它允许你通过URL参数指定排序字段,对返回的数据进行排序操作。

总结:

  • DjangoFilterBackend主要用于基于模型字段进行高级过滤,支持丰富的过滤选项和自定义。
  • filters.SearchFilter主要用于执行文本搜索过滤,支持在指定字段上进行全文搜索,并返回匹配搜索词的结果。
  • filters.OrderingFilter主要用于执行数据排序。

你可以根据你的具体需求选择合适的过滤器后端来实现数据过滤功能。如果你需要更精细的过滤控制和多字段过滤,DjangoFilterBackend是一个不错的选择。如果你只需要简单的文本搜索功能,filters.SearchFilter就足够了。在某些情况下,你甚至可以同时使用它们来实现更复杂的过滤需求,而filters.OrderingFilter的使用相对较少,因为在大多数情况下,排序是后端的工作,在接口内部已经做了相关的排序处理再返回给前端。下面将介绍三个的快速上手使用方式。

DjangoFilterBackend

在Django Rest Framework中,可以使用filters模块来根据数据库字段进行查询。以下是一个示例代码片段,说明如何在DRF中实现根据数据库字段查询的功能:

首先,确保你已经安装了Django Rest Framework。你可以使用以下命令安装它:

pip install djangorestframework

接下来,在你的Django项目的设置文件(settings.py)中,添加django_filtersINSTALLED_APPS设置中:

INSTALLED_APPS = [...'rest_framework','django_filters',...
]

接下来,在你的Django项目的设置文件(settings.py)中,添加DEFAULT_FILTER_BACKENDSREST_FRAMEWORK设置中:

REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

在你的应用程序的models.py文件中,定义你的模型类。例如,假设你有一个名为Book的模型,它有一个字段叫做title

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)# other fields...

接下来,创建一个序列化器(Serializer)来定义模型的序列化和反序列化行为。在你的应用程序的serializers.py文件中,创建一个名为BookSerializer的序列化器:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'  # 可以选择指定特定字段

现在,你可以在视图中使用过滤器查询数据库。在你的应用程序的views.py文件中,创建一个视图,并使用DRF的过滤器。以下是一个示例视图:

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
from django_filters.rest_framework import DjangoFilterBackendclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [DjangoFilterBackend]filterset_fields = ['title']  # 指定要过滤的字段

在这个示例中,filterset_fields属性指定了你想要使用过滤器进行查询的字段。你可以根据需要添加或删除其他字段。

最后,在你的项目的URL配置文件(urls.py)中,将你的视图配置为路由,以便能够访问它:

from django.urls import include, path
from rest_framework import routers
from .views import BookViewSetrouter = routers.DefaultRouter()
router.register(r'books', BookViewSet)urlpatterns = [path('', include(router.urls)),
]

以上代码将创建一个名为books的URL路径,它将映射到你的BookViewSet视图。

完成以上步骤后,你可以使用类似以下的请求来过滤查询结果:

GET /books?title=your-search-term

以上请求将返回具有匹配标题的书籍对象。

注意:在实际开发中,你可能还需要进行身份验证和权限控制,以确保只有经过授权的用户可以访问你的API。以上示例中并未包含这些功能,你可以根据需要进行进一步的开发和配置。

SearchFileter

SearchFilter类支持简单的基于单个查询参数的搜索,并且基于Django管理员的搜索功能。

使用时,可浏览的API将包括一个SearchFilter控件:

使用方式如下所示:

from rest_framework import filtersclass UserListView(generics.ListAPIView):queryset = User.objects.all()serializer_class = UserSerializerfilter_backends = [filters.SearchFilter]search_fields = ['username', 'email']

运行应用之后,可以以如下方式运行接口:

http://example.com/api/users?search=russell

您还可以使用search_fields对外键和多对多字段进行查询,通过如下方式构建:

search_fields = ['username', 'email', 'profile__profession']

更多操作方式可以查看https://www.django-rest-framework.org/api-guide/filtering/#searchfilter

OrderingFilter

OrderingFilter类可以执行按照特定字段进行排序的操作,下面的示例展示了将查询出的users通过username和email进行排序的快速上手过程,首先构建一个ListAPIView。

class UserListView(generics.ListAPIView):queryset = User.objects.all()serializer_class = UserSerializerfilter_backends = [filters.OrderingFilter]ordering_fields = ['username', 'email']

然后你可以通过如下方式进行查询:

http://example.com/api/users?ordering=username

或者进行倒序查询

http://example.com/api/users?ordering=-username

总结

本文介绍了drf filter中DjangoFilterBackend,SearchFilter,OrderingFilter使用方式,更加进阶的使用方式,我更推荐你直接看官方文档,如有任何问题,欢迎交流讨论~

相关文章:

【django开发手册】详解drf filter中DjangoFilterBackend,SearchFilter,OrderingFilter使用方式

💖 作者简介:大家好,我是Zeeland,开源建设者与全栈领域优质创作者。📝 CSDN主页:Zeeland🔥📣 我的博客:Zeeland📚 Github主页: Undertone0809 (Zeeland)&…...

3D开发工具HOOPS Publish如何快速创建交互式3D PDF文档?

HOOPS Publish是一款功能强大的SDK,可以创作丰富的工程数据并将模型文件导出为各种行业标准格式,包括PDF、STEP、JT和3MF。HOOPS Publish核心的3D数据模型是经过ISO认证的PRC格式(ISO 14739-1:2014),它为装配树、拓扑和几何、产品制造信息和视…...

【Kafka】ZooKeeper启动失败报错java.net.BindException: Address already in use: bind

问题描述 Kafka 2.8.1 ZooKeeper启动失败。 zookeeper-server-start.bat ../../config/zookeeper.properties[2023-09-04 18:21:49,497] INFO binding to port 0.0.0.0/0.0.0.0:2181 (org.apache.zookeeper.server.NIOServerCnxnFactory) [2023-09-04 18:21:49,498] ERROR Un…...

系统架构设计师-计算机系统基础知识(1)

目录 一、嵌入式系统概述 1、基本概念 2、嵌入式系统软件组成架构 二、嵌入式软件开发 三、嵌入式硬件 1、嵌入式微处理器 一、嵌入式系统概述 1、基本概念 (1)嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软、硬件…...

Mediasoup在node.js下多线程实现

mediasoup基于socket.io的交互消息来完成join-room的请求过程。Join的过程,实际就是获取stream的过程,也就是视频加载时间(video-load-speed)。在RTMP系统,视频加载时间是秒开。Mediasoup给出的第一个frame是I-frame,但由于交互的…...

一文入门Web网站安全测试

文章目录 Web网页安全风险评估1. 数据泄漏2. 恶意软件传播3. 身份伪装和欺诈 测试Web网页的安全性常见方法和工具漏洞扫描器手动漏洞测试漏洞利用工具Web应用程序防火墙(WAF)测试渗透测试代码审查社会工程学测试 推荐阅读 Web网页安全风险评估 越来越多…...

Django REST framework中的序列化Serializers

序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来…...

LeetCode 剑指 Offer 10- I. 斐波那契数列

LeetCode 剑指 Offer 10- I. 斐波那契数列 题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - …...

Css 将某div设置为透明,但其子元素不透明

可以使用css中的属性opacity来设置元素的透明度,但它会影响到元素的所有子元素。如果想让父元素透明,但子元素不透明,可以使用另外一种方法: 首先,将父元素的背景颜色设置为rgba格式,其中a表示透明度。例如…...

17 | Spark中的map、flatMap、mapToPair mapvalues 的区别

在Apache Spark中,map、flatMap、mapToPair和mapValues是用于对RDD(Resilient Distributed Dataset)进行转换的不同操作。这些操作可以用来处理分布式数据集中的元素,但它们的用途和行为略有不同。 以下是它们的主要区别以及相应的Java代码示例: map:map操作用于对RDD中…...

手写Mybatis:第9章-细化XML语句构建器,完善静态SQL解析

文章目录 一、目标:XML语句构建器二、设计:XML语句构建器三、实现:XML语句构建器3.0 引入依赖3.1 工程结构3.2 XML语句构建器关系图3.3 I/O资源扫描3.4 SQL源码3.4.1 SQL对象3.4.2 SQL源码接口3.4.3 原始SQL源码实现类3.4.4 静态SQL源码实现类…...

云原生Kubernetes:Kubeadm部署K8S单Master架构

目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm,kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …...

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显…...

开发指导—利用 CSS 动画实现 HarmonyOS 动效(二)

注:本文内容分享转载自 HarmonyOS Developer 官网文档 点击查看《开发指导—利用CSS动画实现HarmonyOS动效(一)》 3. background-position 样式动画 通过改变 background-position 属性(第一个值为 X 轴的位置,第二个…...

音频修复和增强工具 iZotope RX 10 for mac激活最新

iZotope RX 10是一款音频修复和增强软件,主要特点包括: 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…...

SpringMVC的简介及工作流程

一.简介 Spring MVC是一个基于Java的开发框架,用于构建灵活且功能强大的Web应用程序。它是Spring Framework的一部分,提供了一种模型-视图-控制器(Model-View-Controller,MVC)的设计模式,用于组织和管理Web…...

JVM垃圾回收机制和常用算法(简洁版)

垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后就会消失,因此不需要对这三个区域进行垃圾回收。 判断一个对象是…...

C/C++源程序到可执行程序exe的全过程(及汇编和反汇编的区别)

1.C/C源程序到可执行程序exe的全过程(及汇编和反汇编的区别) 一个现代编译器的主要工作流程如下: 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇…...

信创优选,国产开源。Solon v2.5.3 发布

Solon 是什么? 国产的 Java 应用开发框架。从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模)。与其他框架相比,解决了两个重要的痛点:启动慢,费内存…...

ElementUI浅尝辄止25:MessageBox 弹框

模拟系统的消息提示框而实现的一套模态对话框组件,用于消息提示、确认消息和提交内容。 从场景上说,MessageBox 的作用是美化系统自带的 alert、confirm 和 prompt,因此适合展示较为简单的内容。如果需要弹出较为复杂的内容,还是要…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

大数据学习(132)-HIve数据分析

​​​​🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言&#x1f4…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...