search_fields与filterset_fields的使用

在Django中,search_fieldsfilterset_fields 可以在视图类中使用,尤其是在 Django REST Framework (DRF) 中。它们分别用于实现搜索和过滤功能。以下是它们在视图类中的具体使用方法。


1. search_fields 在视图类中的使用

search_fields 是 DRF 中 SearchFilter 的一部分,用于在视图类中实现搜索功能。它允许你通过指定字段对查询集进行全文搜索。

使用步骤:
  1. 在视图类中启用 SearchFilter
  2. 定义 search_fields,指定可以搜索的字段。
示例:
from rest_framework import viewsets
from rest_framework import filters
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer# 启用 SearchFilterfilter_backends = [filters.SearchFilter]# 指定可搜索的字段search_fields = ['title', 'author__name']
说明:
  • filter_backends:启用 SearchFilter,允许使用搜索功能。
  • search_fields:指定可以搜索的字段。支持跨关系字段(如 author__name)。
  • 搜索时,可以通过 URL 参数 ?search=keyword 进行搜索。例如:
    • /api/books/?search=example:搜索 titleauthor__name 中包含 “example” 的记录。

2. filterset_fields 在视图类中的使用

filterset_fields 是 DRF 中 DjangoFilterBackend 的一部分,用于在视图类中实现过滤功能。它允许你通过指定字段对查询集进行精确匹配或范围过滤。

使用步骤:
  1. 安装 django-filter 库(如果尚未安装):
    pip install django-filter
    
  2. 在视图类中启用 DjangoFilterBackend
  3. 定义 filterset_fields,指定可以过滤的字段。
示例:
from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer# 启用 DjangoFilterBackendfilter_backends = [DjangoFilterBackend]# 指定可过滤的字段filterset_fields = ['title', 'published_date']
说明:
  • filter_backends:启用 DjangoFilterBackend,允许使用过滤功能。
  • filterset_fields:指定可以过滤的字段。支持精确匹配。
  • 过滤时,可以通过 URL 参数进行过滤。例如:
    • /api/books/?title=example:过滤 title 为 “example” 的记录。
    • /api/books/?published_date=2023-01-01:过滤 published_date 为 “2023-01-01” 的记录。

3. 结合 search_fieldsfilterset_fields

你可以同时启用搜索和过滤功能,结合 SearchFilterDjangoFilterBackend

示例:
from rest_framework import viewsets
from rest_framework import filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer# 启用 SearchFilter 和 DjangoFilterBackendfilter_backends = [filters.SearchFilter, DjangoFilterBackend]# 指定可搜索的字段search_fields = ['title', 'author__name']# 指定可过滤的字段filterset_fields = ['title', 'published_date']
说明:
  • 现在你可以同时使用搜索和过滤功能:
    • /api/books/?search=example:搜索 titleauthor__name 中包含 “example” 的记录。
    • /api/books/?title=example:过滤 title 为 “example” 的记录。
    • /api/books/?search=example&published_date=2023-01-01:结合搜索和过滤。

4. 自定义过滤逻辑

如果需要更复杂的过滤逻辑,可以自定义 FilterSet 类。

示例:
from django_filters import rest_framework as filters
from .models import Bookclass BookFilter(filters.FilterSet):class Meta:model = Bookfields = {'title': ['exact', 'icontains'],'published_date': ['exact', 'gte', 'lte'],}class BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializerfilter_backends = [DjangoFilterBackend]filterset_class = BookFilter  # 使用自定义的 FilterSet
说明:
  • BookFilter 类允许更灵活的过滤条件,例如:
    • /api/books/?title__icontains=example:搜索 title 包含 “example” 的记录。
    • /api/books/?published_date__gte=2023-01-01:过滤 published_date 大于等于 “2023-01-01” 的记录。

5. 时间范围查询

在 Django 和 Django REST Framework (DRF) 中,时间范围查询是一种常见的需求,通常用于过滤某个时间范围内的数据。可以通过 django-filter 库或自定义过滤逻辑来实现时间范围查询。

以下是实现时间范围查询的几种方法:


5.1. 使用 django-filter 实现时间范围查询

django-filter 是一个强大的库,支持对时间字段进行范围查询(如 gtelte 等)。

示例代码

假设你有一个 Event 模型,其中包含一个 start_time 字段,你想根据时间范围过滤事件。

from django_filters import rest_framework as filters
from .models import Eventclass EventFilter(filters.FilterSet):start_time = filters.DateTimeFilter(field_name="start_time", lookup_expr='gte')  # 大于等于end_time = filters.DateTimeFilter(field_name="start_time", lookup_expr='lte')   # 小于等于class Meta:model = Eventfields = ['start_time', 'end_time']# 在视图类中使用
from rest_framework import viewsets
from .serializers import EventSerializerclass EventViewSet(viewsets.ModelViewSet):queryset = Event.objects.all()serializer_class = EventSerializerfilter_backends = [filters.DjangoFilterBackend]filterset_class = EventFilter
说明:
  • start_timeend_time 是 URL 参数,用于指定时间范围。
  • 例如:
    • /api/events/?start_time=2023-01-01T00:00:00&end_time=2023-12-31T23:59:59:查询 start_time 在 2023 年内的所有事件。

5.2. 自定义过滤逻辑

如果需要更灵活的时间范围查询,可以在视图类中自定义过滤逻辑。

示例代码
from rest_framework import viewsets
from rest_framework.response import Response
from .models import Event
from .serializers import EventSerializer
from datetime import datetimeclass EventViewSet(viewsets.ModelViewSet):queryset = Event.objects.all()serializer_class = EventSerializerdef get_queryset(self):queryset = super().get_queryset()start_time = self.request.query_params.get('start_time')end_time = self.request.query_params.get('end_time')if start_time and end_time:# 将字符串转换为 datetime 对象start_time = datetime.fromisoformat(start_time)end_time = datetime.fromisoformat(end_time)# 过滤时间范围内的数据queryset = queryset.filter(start_time__gte=start_time, start_time__lte=end_time)return queryset
说明:
  • 通过 request.query_params 获取 URL 参数。
  • 使用 filter() 方法对查询集进行过滤。
  • 例如:
    • /api/events/?start_time=2023-01-01T00:00:00&end_time=2023-12-31T23:59:59:查询 start_time 在 2023 年内的所有事件。

5.3. 使用 DRF 的 DateRangeFilter

django-filter 提供了 DateRangeFilter,可以方便地实现时间范围查询。

示例代码
from django_filters import rest_framework as filters
from .models import Eventclass EventFilter(filters.FilterSet):start_time = filters.DateRangeFilter(field_name="start_time")class Meta:model = Eventfields = ['start_time']# 在视图类中使用
from rest_framework import viewsets
from .serializers import EventSerializerclass EventViewSet(viewsets.ModelViewSet):queryset = Event.objects.all()serializer_class = EventSerializerfilter_backends = [filters.DjangoFilterBackend]filterset_class = EventFilter
说明:
  • DateRangeFilter 提供了预定义的时间范围选项,如:
    • /api/events/?start_time=2023:查询 2023 年的所有事件。
    • /api/events/?start_time=2023-01:查询 2023 年 1 月的所有事件。
    • /api/events/?start_time=2023-01-01:查询 2023 年 1 月 1 日的所有事件。

5.4. 使用 DRF 的 DateTimeFromToRangeFilter

RangeFilterdjango-filter 提供的另一种过滤器,支持对时间字段进行范围查询。

示例代码
from django_filters import rest_framework as filters
from .models import Eventclass EventFilter(filters.FilterSet):start_time = filters.DateTimeFromToRangeFilter(field_name="start_time")class Meta:model = Eventfields = ['start_time']# 在视图类中使用
from rest_framework import viewsets
from .serializers import EventSerializerclass EventViewSet(viewsets.ModelViewSet):queryset = Event.objects.all()serializer_class = EventSerializerfilter_backends = [filters.DjangoFilterBackend]filterset_class = EventFilter
说明:
  • DateTimeFromToRangeFilter 支持从 start_time_afterstart_time_before 的范围查询。
  • 例如:
    • /api/events/?start_time_after=2023-01-01T00:00:00&start_time_before=2023-12-31T23:59:59:查询 start_time 在 2023 年内的所有事件。

6. 非时间范围查询

6.1. 使用 RangeFilter 实现数字范围查询

如果需要对数字字段进行范围查询,可以使用 RangeFilter

示例代码
from django_filters import rest_framework as filters
from .models import Productclass ProductFilter(filters.FilterSet):price = filters.RangeFilter(field_name="price")  # 价格范围查询class Meta:model = Productfields = ['price']# 在视图类中使用
from rest_framework import viewsets
from .serializers import ProductSerializerclass ProductViewSet(viewsets.ModelViewSet):queryset = Product.objects.all()serializer_class = ProductSerializerfilter_backends = [filters.DjangoFilterBackend]filterset_class = ProductFilter
说明:
  • RangeFilter 支持从 minmax 的范围查询。
  • 例如:
    • /api/products/?price_min=50&price_max=100:查询价格在 50 到 100 之间的产品。

总结

  • search_fields:用于实现全文搜索功能,通常与 SearchFilter 结合使用。
  • filterset_fields:用于实现精确匹配或范围过滤,通常与 DjangoFilterBackend 结合使用。
  • 两者可以结合使用,同时支持搜索和过滤功能。
  • 如果需要更复杂的过滤逻辑,可以自定义 FilterSet 类。

根据你的需求选择合适的工具来实现数据的搜索和过滤功能。

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

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

相关文章

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型,用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求,而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识,确保对业务需…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker:在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

Java随机生成n位验证码

Java学习笔记 今天写一个随机生成n位的验证码,包含字母大小写和数字,直接见代码。 package com.itheima.hello;// 生成一个随机位数的验证码 public class ScannerDemo1 {public static void main(String[] args){System.out.println(getCode(4));Syst…

go复习目录

全部都是博主的学习笔记,放着链接用的,自己收藏,包含基础内容、go三方包、vue、数据结构、web框架、设计模式、docker、go连接kafka、redis、grpc、中间件 文章目录 基础内容go三方包vue数据结构web框架设计模式dockergo连接kafkaredisgrpc中…

23种设计模式-创建型模式-抽象工厂

文章目录 简介场景问题1. 风格一致性失控2. 对象创建硬编码3. 产品族管理失效 解决总结 简介 抽象工厂是一种创建型设计模式,可以生成相关对象系列,而无需指定它们的具体类。 场景 假设你正在写一个家具店模拟器。 你的代码这些类组成: 相…

案例:网络命名空间模拟隔离主机场景

场景描述 假设我们需要在同一台物理机上模拟两台独立的主机(Host A 和 Host B),它们分别位于不同的网络命名空间中,并通过虚拟以太网对(veth pair)进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…

新闻发布时间抽取(二)

1. 再论抽取方法 在前一期实验中,对gne组件进行分析和完善,对三种时间抽取的方法进行了实验对比。 在对抽取结果进行个例分析的过程中,我发现此前实验存在几个问题: 抽取的1000篇新闻存在一定的重复,经过ID去重大约减…

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶,另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素,出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…

Android11至15系统定制篇

Android 11至15系统定制核心要点解析 一、Android 11关键定制特性 ‌分区存储强制化‌ 公共目录(如Downloads、Pictures)与应用专属目录分离,应用更新后无法通过requestLegacyExternalStorage绕过限制‌1。需申请MANAGE_EXTERNAL_STORAGE权限…

macOS 使用 enca 识别 文件编码类型(比 file 命令准确)

文章目录 macOS 上安装 enca基本使用起因 - iconv关于 enca安装 Encaenca & enconv 其它用法 macOS 上安装 enca brew install enca基本使用 enca filepath.txt示例 $ enca 动态规划算法.txt [0] Simplified Chinese National Standard; GB2312CRLF line terminat…

线段树与扫描线 —— 详解算法思想及其C++实现

目录 一、线段树(Segment Tree) 基本概念 结构 操作 示例代码 二、扫描线(Sweep Line) 基本概念 应用场景 示例代码(矩形面积并集) 三、总结 一、线段树(Segment Tree) 基本…

汇编代码中嵌入回调函数的优化说明

一、概述 在 PowerPC 的汇编代码中,我们需要实现调用 C 函数(例如回调函数),并传递参数。本文将详细介绍如何通过一系列步骤完成这一目标,包括代码示例和详细的注释。 二、调用 C 函数的基本步骤及代码 1. 保存工作寄…

Uni-App 双栏联动滚动组件开发详解 (电梯导航)

本文基于提供的代码实现一个左右联动的滚动组件&#xff0c;以下是详细的代码解析与实现原理说明&#xff1a; <!--双栏联动滚动组件 - 技术解析功能特性&#xff1a;1. 左侧导航栏与右侧内容区双向联动2. 自适应容器高度3. 平滑滚动定位4. 动态内容位置计算 --> <te…

软考复习-传输介质与编码

传输介质 双绞线 传输距离100一200m&#xff0c;即网线&#xff0c;有多种分类 UTP非屏蔽双绞线 STP屏蔽双绞线 线序标准有两种为&#xff1a; T568A标准&#xff1a;绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 T568B标准&#xff1a;橙白、橙、绿白、蓝、蓝白、绿、棕白、…

论文阅读笔记:Denoising Diffusion Probabilistic Models (3)

论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (2) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (3) 4、损失函数逐项分析 可以看出 L L L总共分为了3项…

PyTorch 面试题及参考答案(精选100道)

目录 PyTorch 的动态计算图与 TensorFlow 的静态计算图有何区别?动态图的优势是什么? 解释张量(Tensor)与 NumPy 数组的异同,为何 PyTorch 选择张量作为核心数据结构? 什么是 torch.autograd 模块?它在反向传播中的作用是什么? 如何理解 PyTorch 中的 nn.Module 类?…

#C8# UVM中的factory机制 #S8.1.4# 约束的重载

今天,复习一下《UVM实战》一书中的 关于约束的重载 章节学习。 一 问题引导 文件:src/ch8/section8.1/8.1.2/rand_mode/my_transaction.sv4 class my_transaction extends uvm_sequence_item; …17 constraint crc_err_cons{18 crc_err == 1b0;19 }20 const…

空调遥控器低功耗单片机方案

RAMSUN空调遥控器采用先进的32位低功耗单片机作为核心控制器&#xff0c;通过优化软件算法和硬件设计&#xff0c;实现了空调遥控器的低功耗运行。单片机集成了多种功能模块&#xff0c;包括红外发射、按键扫描、电源管理等&#xff0c;有效降低了整体功耗。同时&#xff0c;该…

结构型——代理模式

结构型——代理模式 代理模式指的是通过创建一个代理来控制对原始对象的访问。代理在客户端与实际对象之间充当“中介” 特点 访问控制&#xff1a;代理对象可以控制对实际对象的访问&#xff0c;从而实现对访问权限的控制。延迟加载&#xff1a;代理对象可以在实际对象被调…

【算法】常见排序算法(插入排序、选择排序、交换排序和归并排序)

文章目录 前言一、排序概念及常见排序算法框图1.排序概念2.常见排序算法框图 二、实现比较排序算法1.插入排序1.1 直接插入排序1.2 希尔排序 2.选择排序2.1 直接选择排序2.2 堆排序 3.交换排序3.1 冒泡排序3.2 快速排序3.2.1 hoare版本3.2.2 挖坑法3.2.3 lomuto前后指针 3.3 快…