Django ORM中的Q對象

Q 對象在 Django ORM 中用于構建復雜的查詢條件,特別是當你需要使用邏輯運算符(如 AND、OR、NOT)時。以下是一些使用 Q 對象進行復雜查詢的實際例子。

Q對象使用

模型

假設我們有一個包含員工信息的模型 Employee

from django.db import modelsclass Employee(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()department = models.CharField(max_length=100)salary = models.DecimalField(max_digits=10, decimal_places=2)hire_date = models.DateField()def __str__(self):return self.name

1. 使用 Q 對象進行 OR 查詢

獲取所有年齡大于30或工資高于50000的員工:

from django.db.models import Q# 獲取所有年齡大于30或工資高于50000的員工
employees = Employee.objects.filter(Q(age__gt=30) | Q(salary__gt=50000))
for employee in employees:print(employee.name, employee.age, employee.salary)

2. 使用 Q 對象進行 AND 查詢

獲取所有年齡大于30且工資高于50000的員工:

# 獲取所有年齡大于30且工資高于50000的員工
employees = Employee.objects.filter(Q(age__gt=30) & Q(salary__gt=50000))
for employee in employees:print(employee.name, employee.age, employee.salary)

3. 使用 Q 對象進行 NOT 查詢

獲取所有不在 “IT” 部門的員工:

# 獲取所有不在 "IT" 部門的員工
employees = Employee.objects.filter(~Q(department='IT'))
for employee in employees:print(employee.name, employee.department)

4. 組合多個 Q 對象

獲取所有年齡大于30且工資高于50000,或者在 “HR” 部門的員工:

# 獲取所有年齡大于30且工資高于50000,或者在 "HR" 部門的員工
employees = Employee.objects.filter((Q(age__gt=30) & Q(salary__gt=50000)) | Q(department='HR'))
for employee in employees:print(employee.name, employee.age, employee.salary, employee.department)

5. 使用 Q 對象進行復雜的日期查詢

獲取所有在2020年之后入職且工資高于60000的員工:

import datetime# 獲取所有在2020年之后入職且工資高于60000的員工
employees = Employee.objects.filter(Q(hire_date__gt=datetime.date(2020, 1, 1)) & Q(salary__gt=60000))
for employee in employees:print(employee.name, employee.hire_date, employee.salary)

6. 使用 Q 對象進行字段間比較

獲取所有年齡大于工資除以1000的員工:

from django.db.models import F# 獲取所有年齡大于工資除以1000的員工
employees = Employee.objects.filter(Q(age__gt=F('salary') / 1000))
for employee in employees:print(employee.name, employee.age, employee.salary)

7. 使用 Q 對象進行條件更新

將所有年齡大于40或工資低于40000的員工的部門設置為 “Senior”:

# 將所有年齡大于40或工資低于40000的員工的部門設置為 "Senior"
Employee.objects.filter(Q(age__gt=40) | Q(salary__lt=40000)).update(department='Senior')

8. 使用 Q 對象進行復雜的嵌套查詢

獲取所有年齡大于30且工資高于50000,或者年齡小于25且在 “Marketing” 部門的員工:

# 獲取所有年齡大于30且工資高于50000,或者年齡小于25且在 "Marketing" 部門的員工
employees = Employee.objects.filter((Q(age__gt=30) & Q(salary__gt=50000)) | (Q(age__lt=25) & Q(department='Marketing'))
)
for employee in employees:print(employee.name, employee.age, employee.salary, employee.department)

在不使用 Q 對象的情況下,你可以直接在 filter 方法中傳遞多個條件,這些條件默認是 AND 關系。以下是如何實現相同查詢的示例:

不使用 Q 對象的 AND 查詢

模型

假設我們有一個包含員工信息的模型 Employee

from django.db import modelsclass Employee(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()department = models.CharField(max_length=100)salary = models.DecimalField(max_digits=10, decimal_places=2)hire_date = models.DateField()def __str__(self):return self.name

獲取所有年齡大于30且工資高于50000的員工:

# 獲取所有年齡大于30且工資高于50000的員工
employees = Employee.objects.filter(age__gt=30, salary__gt=50000)
for employee in employees:print(employee.name, employee.age, employee.salary)

filter 方法接受多個關鍵字參數,每個參數表示一個查詢條件。多個條件之間默認是 AND 關系,因此可以直接使用逗號分隔多個條件。

例子

1. 獲取所有年齡大于30且在 “IT” 部門的員工:
# 獲取所有年齡大于30且在 "IT" 部門的員工
employees = Employee.objects.filter(age__gt=30, department='IT')
for employee in employees:print(employee.name, employee.age, employee.department)
2. 獲取所有工資高于50000且在2020年之后入職的員工:
import datetime# 獲取所有工資高于50000且在2020年之后入職的員工
employees = Employee.objects.filter(salary__gt=50000, hire_date__gt=datetime.date(2020, 1, 1))
for employee in employees:print(employee.name, employee.salary, employee.hire_date)
3. 獲取所有年齡大于30且工資高于50000且在 “HR” 部門的員工:
# 獲取所有年齡大于30且工資高于50000且在 "HR" 部門的員工
employees = Employee.objects.filter(age__gt=30, salary__gt=50000, department='HR')
for employee in employees:print(employee.name, employee.age, employee.salary, employee.department)

Django ORM 也可以輕松實現多個條件的 AND 查詢。但是Q 對象在需要使用 OR 或 NOT 邏輯時特別有用,但對于簡單的 AND 查詢,直接在 filter 方法中傳遞多個條件通常是更簡潔的選擇。

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

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

相關文章

一個引發openssl崩潰問題案例

1 背景 最近用libevent寫了一個https代理功能,在調研的時候,遇到了一個項目用到了本地多個openssl庫引發的ssl握手崩潰問題。 2 開發環境 項目庫版本號依賴項libeventlibevent-2.1.8-stableopenssl 1.1openssl1.0u / 1.1.1w / 3.3.1...... 3 問題現象…

Python酷庫之旅-第三方庫Pandas(024)

目錄 一、用法精講 61、pandas.to_numeric函數 61-1、語法 61-2、參數 61-3、功能 61-4、返回值 61-5、說明 61-6、用法 61-6-1、數據準備 61-6-2、代碼示例 61-6-3、結果輸出 62、pandas.to_datetime函數 62-1、語法 62-2、參數 62-3、功能 62-4、返回值 62-…

關于SQLException: Illegal mix of collations (`utf8mb4_general_ci,IMPLICIT`)...錯誤

希望文章能給到你啟發和靈感~ 如果覺得文章對你有幫助的話,點贊 關注 收藏 支持一下博主吧~ 閱讀指南 開篇說明一、基礎環境說明1.1 硬件環境1.2 軟件環境 二、報錯信息三、最后 開篇說明 記錄一個查詢錯誤 場景:數據庫之間某表復…

曠野之間 16 – AI 代理、AI 代理基礎設施、平臺和比較

在本文中,我們將研究 AI 代理、AI 代理基礎設施、市場上最流行的 AI 代理平臺、它們的比較以及 AI 代理的未來 我們將按以下順序討論這些主題 1. 關于人工智能代理 2. 人工智能代理在行業中的應用 3. AI代理基礎設施 4. 最受歡迎的 AI 代理平臺及比較 5.您將如…

【筆記】nginx命令

查看 啟動 通過./nginx啟動nginx之后 可以在虛擬機中進入/usr/local/nginx/html 去查看cat index.html 也就是此頁面的源代碼 進入vim /etc/profile 配置完之后保存退出 source /etc/profile 手動重載資源 隨后就可以在任意位置重載資源了 nginx -s reload 部署靜態資源就把靜…

兩項國際設計獎,支持雙設備—悠律Ringbuds pro開放式藍牙耳機體驗

在音頻設備領域,開放式耳機對比入耳式耳機的優勢就是既能聽到耳機內的聲音又能感知環境音,很適合在戶外以及辦公時使用,今天分享一款新品牌悠律UMELODY——悠律凝聲環Ringbuds pro,它采用氣傳導耳掛式設計,佩戴舒適、安…

【人工智能】 知識表示與推理(八數碼 + 傳教士與野人渡河)

目錄 一、八數碼難題 1. 需求分析 2. 數據結構、功能模塊設計與說明 2.1 算法思路 2.2 數據結構 3. 核心代碼與測試結果說明 3.1 核心代碼 3.2 測試結果說明 4. 存在的問題與體會 4.1 存在的問題 4.2 體會 二、傳教士與野人渡河 1. 需求分析 2. 數據結構、功能模…

基于EMQX+Flask+InfluxDB+Grafana打造多協議物聯網云平臺:MQTT/HTTP設備接入與數據可視化流程(附代碼示例)

摘要: 本文深入淺出地介紹了物聯網、云平臺、MQTT、HTTP、數據可視化等核心概念,并結合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一個支持多協議的物聯網云平臺。文章結構清晰,圖文并茂,代碼翔實易懂&#xff0…

2024-07-14 Unity插件 Odin Inspector1 —— 插件介紹

文章目錄 1 介紹2 模塊3 學習目的 1 介紹 ? Odin Inspector 是 Unity 的一個插件,擁有強大、自定義和用戶友好的編輯器,而無需編寫任何自定義編輯器代碼,使得編程過程中的數據可視化更容易實現。 ? 具體功能包括: 更舒適美觀…

軟件設計師(中級)備考視頻教程

一、視頻介紹 本視頻主要包括軟件設計師系統學習教程,通過學習本視頻,可以幫助考生高效且深入地掌握軟件設計師資格考試核心知識,全方位覆蓋考試要點,從而輕松備戰考試。視頻不僅涵蓋了考試所需的全面知識體系,還通過直…

Linux--USB驅動開發(二)插入USB后的內核執行程序

一、USB總線驅動程序的作用 a)識別USB設備 1.1 分配地址 1.2 并告訴USB設備(set address) 1.3 發出命令獲取描述符 b)查找并安裝對應的設備驅動程序 c)提供USB讀寫函數 二、USB設備工作流程 由于內核自帶了USB驅動,所以我們先插入一個U…

Google Colab 云端硬盤路徑讀取

加載云端硬盤 需要在左上角點擊這個文件圖標; from google.colab import drive drive.mount("/content/drive") # 掛載云端硬盤import os path"/content/drive/MyDrive/TextClassificationCustom" os.chdir(path) # 以路徑path作為當前工作目…

在 SwiftUI 中的作用域動畫

文章目錄 前言簡單示例動畫視圖修飾符使用多個可動畫屬性使用 ViewBuilder總結 前言 從一開始,動畫就是 SwiftUI 最強大的功能之一。你可以在 SwiftUI 中快速構建流暢的動畫。唯一的缺點是每當我們需要運行多步動畫或將動畫范圍限定到視圖層次結構的特定部分時&…

docker emqx 配置密碼和禁用匿名連接

mqtt版本emqx/emqx:4.4.3 1.首先把鏡像內目錄/opt/emqx/etc拷貝到本地 2.做映射 3.allow_anonymous, false改成true 4. 5.MQTTX連不上的話看看下圖的有沒有打開

【nginx】nginx的優點

目錄 一、高性能1.1 高并發處理1.2 低內存消耗1.3 快速響應 二、高擴展性2.1 模塊化設計2.2 動態模塊擴展 三、高可靠性3.1 核心框架穩定3.2 進程管理3.3 負載均衡與健康檢查3.4 熱部署 四、功能豐富4.1 反向代理4.2 HTTP緩存4.3 安全功能 五、易于配置和管理5.1 配置文件簡單5…

windows下環境變量開啟方式

第一種方法: 使用快捷鍵打開“運行”對話框:按下 Win R 組合鍵,這將打開“運行”窗口。 輸入系統屬性命令:在“運行”窗口中輸入 sysdm.cpl 然后按回車鍵。這將打開“系統屬性”對話框。【sysdm.cpl是"System Data Manager…

【Go系列】Go的指針

承上啟下 我們在前面的文章中,首先介紹了GO的基礎語法,然后介紹了Goroutine和channel這個最具有特色的東西,同時介紹了Sync和context,以及在上篇文章中詳細距離說明了Go里面用于高并發的多種寫法。基礎的使用方法也告一段落了&…

Linux多線程編程-哲學家就餐問題詳解與實現(C語言)

在哲學家就餐問題中,假設有五位哲學家圍坐在圓桌前,每位哲學家需要進行思考和進餐兩種活動。他們的思考不需要任何資源,但進餐需要使用兩根筷子(左右兩側各一根)。筷子是共享資源,哲學家們在進行進餐時需要…

Qt qml詳細介紹

一.基本類型 QML的基本類型包括了很多不同的類型,這些類型可以用于定義用戶界面元素、屬性和信號。以下是一些常用的QML基本類型及其詳細介紹: 數值類型:包括整數類型(int、uint、short、ushort等)和浮點數類型&#…

c++ :運算符重載函數中的細節

賦值運算符重載與拷貝構造函數 (1)區分初始化時的賦值(一般就叫初始化),和非初始化時的賦值(一般就叫賦值) (2)實驗驗證初始化和賦值時各自對應 避免賦值運算符中的自賦值 (1)自賦值就是Person a; a a; (2)自賦值如…