Django中get()與filter()對比

在 Django 中,get()filter() 是 QuerySet API 中用于檢索數據的兩個核心方法,它們的功能和使用場景有明顯區別。以下是詳細對比:

1. 核心區別

特性get()filter()
返回值單個對象(模型實例)查詢集(QuerySet,可迭代)
數量限制必須精確匹配1個對象可以匹配0個、1個或多個對象
對象不存在時拋出 DoesNotExist 異常返回空查詢集(不報錯)
多對象匹配時拋出 MultipleObjectsReturned 異常返回包含多個對象的查詢集
鏈式調用不支持(返回的是模型實例)支持(可繼續添加過濾條件)

1111

2. 語法與示例

get() 的用法
# 獲取 ID 為 1 的書(必須存在且唯一)
book = Book.objects.get(id=1)# 等價的手動異常處理
try:book = Book.objects.get(id=1)
except Book.DoesNotExist:# 處理不存在的情況pass
except Book.MultipleObjectsReturned:# 處理多對象匹配的情況pass
filter() 的用法
# 獲取所有已發布的書(可能有0本或多本)
books = Book.objects.filter(status='published')# 鏈式過濾:獲取已發布且價格大于 50 的書
books = Book.objects.filter(status='published').filter(price__gt=50)# 等價的單語句寫法
books = Book.objects.filter(status='published', price__gt=50)# 獲取第一本書或 None(推薦替代 get() 的安全寫法)
first_book = books.first()  # 等價于 books[0] if books else None

3. 性能對比

  • get():直接查詢單條記錄,生成的 SQL 類似 SELECT ... WHERE ... LIMIT 1,理論上更高效。
  • filter().first():生成的 SQL 是 SELECT ... WHERE ... LIMIT 1,與 get() 幾乎相同,但多了一步 Python 對象轉換,性能損耗可忽略不計。

注意:在查詢條件唯一(如主鍵查詢)時,兩者性能接近;但 filter().first() 更安全。

4. 適用場景

推薦使用 get() 的場景
  • 查詢條件唯一(如通過主鍵或唯一鍵查詢)。
  • 對象必須存在,否則視為程序錯誤(如配置項、固定ID的系統數據)。
  • 示例
    user = User.objects.get(username='admin')  # 管理員用戶必須存在
    
推薦使用 filter() 的場景
  • 查詢條件不唯一(如按類別篩選商品)。
  • 結果可能為空(如搜索功能)。
  • 需要鏈式查詢(如分頁、排序、多條件組合)。
  • 示例
    # 搜索功能(結果可能為空)
    books = Book.objects.filter(title__icontains='python')# 分頁查詢
    books = Book.objects.filter(category='tech').order_by('-pub_date')[:10]
    

5. 常見錯誤案例

錯誤使用 get() 的場景
# 錯誤:title 可能不唯一,導致 MultipleObjectsReturned
book = Book.objects.get(title="Python")# 正確:使用 filter().first()
book = Book.objects.filter(title="Python").first()
低效的 filter() 使用
# 低效:兩次數據庫查詢
if Book.objects.filter(id=1).exists():book = Book.objects.get(id=1)  # 重復查詢# 高效:單次查詢
book = Book.objects.filter(id=1).first()

6. 總結

場景方法
通過主鍵/唯一鍵獲取單個對象get()(需確保存在)
安全獲取單個對象(不存在時返回 None)filter().first()
查詢可能存在多個結果或空結果filter()
需要鏈式查詢(如分頁、排序)filter()

建議:優先使用 filter().first() 替代 get(),除非你能絕對保證查詢條件的唯一性和存在性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92000.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL鎖(一) 概述與分類

1.1 MySQL鎖的由來 客戶端發往 MySQL 的一條條 SQL 語句,實際上都可以理解成一個個單獨的事務(一條sql語句默認就是一個事務)。而事務是基于數據庫連接的,每個數據庫連接在 MySQL 中,又會用一條工作線程來維護&#x…

PyTorch里的張量及張量的操作

張量的簡介 張量是多重線性映射在給定基下的坐標表示,可視為向量和矩陣的泛化。 0 維張量:標量(如 5)1 維張量:向量(如 [1, 2, 3])2 維張量:矩陣(如 [[1, 2], [3, 4]]&…

向量數據庫Faiss vs Qdrant全面對比

Faiss vs Qdrant 全面對比表 向量數據庫是一種相對較新的方式,用于與來自不透明機器學習模型(如深度學習架構)派生的抽象數據表示進行交互。這些表示通常被稱為向量或嵌入(embeddings),它們是用于訓練機器學習模型完成諸如情感分析、語音識別、目標檢測等任務的數據的壓…

2025年AIR SCI1區TOP,縮減因子分數階蜣螂優化算法FORDBO,深度解析+性能實測

目錄1.摘要2.蜣螂優化算法DBO原理3.改進策略4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 傳統DBO存在探索與開發能力失衡、求解精度低以及易陷入局部最優等問題。因此,本文提出了帶有縮減因子分數階蜣螂優化算法(FORDBO&#xff0…

爬蟲逆向之JS混淆案例(全國招標公告公示搜索引擎 type__1017逆向)

案例https://ctbpsp.com/#/ 截至2025.07.19可用 定位加密位置 加密位置: 定位方式,XHR,跟棧 跟棧 QL打斷點,重新斷住 分析為,一個函數傳入四個參數 var QL QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * …

Hive常用命令總結

一、數據庫操作 -- 創建數據庫(默認路徑) CREATE DATABASE IF NOT EXISTS myhive;-- 指定路徑創建數據庫 CREATE DATABASE myhive2 LOCATION /myhive2;-- 查看數據庫信息 DESC DATABASE myhive;-- 刪除數據庫(強制刪除表) DROP DA…

Spring整合MyBatis詳解

Spring整合MyBatis詳解一、整合優勢與核心思路1.1 整合優勢1.2 核心整合思路二、環境搭建與依賴配置2.1 開發環境2.2 Maven依賴配置三、整合配置(核心步驟)3.1 數據庫配置文件(db.properties)3.2 Spring配置文件(sprin…

Windows CMD(命令提示符)中最常用的命令匯總和實戰示例

CMD命令匯總 下面是 Windows CMD(命令提示符)中最常用的命令匯總,共 30 個,包含說明和典型代碼示例,適合日常開發、系統操作、文件管理、網絡診斷等場景。一、文件與目錄操作(最常用)命令說明示…

嵌入式硬件篇---舵機(示波器)

舵機是一種高精度的角度控制執行器件,廣泛應用于機器人、航模、自動化設備等領域。其核心特點是能通過控制信號精準定位到特定角度(通常范圍為 0-180,部分可到 360 連續旋轉)。常見的舵機類型可根據結構、控制方式、用途等維度劃分…

嵌入式硬件篇---按鍵

按鍵是電子系統中最基礎的人機交互部件,通過機械或電子方式實現電路通斷或狀態切換。根據結構和工作原理的不同,常見按鍵可分為機械按鍵、薄膜按鍵、觸摸按鍵等,以下詳細介紹其工作原理、應用場景及電路特點:一、機械按鍵&#xf…

試用SAP BTP 06:AI服務-Data Attribute Recommendation

創建實例 方法一:BTP主控室-子賬戶-服務市場 輸入實例配置信息,下一步 不用參數,下一步 審核實例,點擊創建 實例創建完成后,創建服務鍵值 輸入鍵值名稱,點擊 創建 方法二(建議)&…

訓詁學中的“形音義互求”對NLP、知識圖譜、注意力機制的啟示

一、訓詁學與現代人工智能結合的學術價值與技術潛力1. ??訓詁學的核心優勢與AI語義分析的契合點??訓詁學作為中國傳統學術中研究古代文獻語義的核心學科,其方法論和理論框架對自然語言處理(NLP)的深層語義分析具有深刻的啟發性和技術補充…

http基礎一

1. HTTP是什么? HTTP(超文本傳輸協議,HyperText Transfer Protocol)是一種用于從萬維網服務器傳輸超文本到本地瀏覽器的協議。它是無狀態的客戶端-服務器協議,通常在Web瀏覽器和Web服務器之間用于傳輸網頁、圖片、視頻…

西門子 S7-1500 系列 PLC CPU 選型全指南:從類型到實戰

在西門子 S7-1500 系列 PLC 的系統構建中,CPU 作為核心控制單元,其選型直接決定了自動化系統的性能、功能擴展性和適用場景。本文將系統解析 S7-1500 系列 CPU 的類型劃分、核心參數、典型型號功能及選型流程,助你精準匹配工業控制需求。一、…

PaddleOCR 與 PaddleX 調試

PaddleOCR 與 PaddleX 調試1.安裝1.1 環境準備1.2用Conda創建虛擬環境2.測試2.1發票測試2.2 手寫漢字識別3.PaddleOCR 與 PaddleX 對比3.1 基于 PaddleX 部署 OCR 服務1.安裝 PP OCR 文檔 1.1 環境準備 根據自己操作系統按網上指導安裝 ccache ccache --version是否已安裝 …

imx6ull-系統移植篇11——U-Boot 移植(下)

目錄 前言 移植過程 添加開發板默認配置文件 添加開發板對應的頭文件 添加開發板對應的板級文件夾 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 圖形界面配置文件 編譯 uboot LCD 驅動修改 修改源文件 修改頭文…

30天打牢數模基礎-模擬退火算法講解

二、完整Python代碼 import random import mathdef rastrigin(x, y):"""二維Rastrigin函數(目標函數,需最小化)參數:x: 自變量xy: 自變量y返回:函數值f(x,y)"""return 20 x**2 y**2 …

論文閱讀 - FastInst

文章目錄1 概述2 模型說明2.1 總體架構2.2 輕量pixel decoder2.3 實例激活引導的Query2.4 雙路徑更新策略2.5 GT掩碼引導學習2.6 損失函數3 效果1 概述 FastInst是一種基于query的實時實例分割方法,它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform(摁下鼠標左鍵的瞬間)二、移動點擊的物體(摁著鼠標左鍵不放)三、松開左鍵清理被移動對象屬性總結注:本文章只是學習總結的筆記,視頻鏈接 一、獲取到點擊物體的Tansfor…