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.pswp.cn/diannao/74317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74317.shtml
英文地址,請注明出處:http://en.pswp.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 快…