Django中的QuerySet

hisun9發表於2024-11-21

在Django中,objects 是 模型管理器(Model Manager) 的預設例項。它允許你透過模型類來查詢資料庫,執行常見的查詢操作,比如獲取、建立、更新和刪除資料。

每個Django模型都會自動建立一個預設的模型管理器,名為 objects。你可以透過它來執行與該模型相關的各種資料庫操作。

在Django中,QuerySet 是用於與資料庫互動的一個物件列表。它表示從資料庫中獲取的一組資料,並支援對資料進行過濾、排序等操作。

1. 什麼是QuerySet?

  • QuerySet 是Django模型的資料庫查詢結果集,它是延遲載入的,即只有在需要時才會真正執行資料庫查詢。

  • QuerySet 可以透過模型的管理器物件(例如 objects)來生成。

2. 常用的QuerySet操作

(1) 獲取所有物件

ModelName.objects.all()

返回模型的所有物件。

(2) 篩選資料 (filter)

用於根據條件篩選符合條件的物件。

ModelName.objects.filter(field_name=value)

比如:

# 獲取所有年齡為18的使用者
User.objects.filter(age=18)

(3) 排除資料 (exclude)

用於排除某些條件的資料。

ModelName.objects.exclude(field_name=value)

比如:

# 排除年齡為18的使用者
User.objects.exclude(age=18)

(4) 獲取單個物件 (get)

當確定只有一個結果時,可以使用 get 方法。否則會報錯。

# 獲取主鍵為1的使用者
User.objects.get(pk=1)

(5) 排序 (order_by)

對查詢結果進行排序

ModelName.objects.order_by('field_name')

比如:

# 按年齡升序排序
User.objects.order_by('age')

# 按年齡降序排序
User.objects.order_by('-age')

(6) 限制返回數量 ([:n])

可以像列表一樣切片來限制結果集。

ModelName.objects.all()[:10]  # 前10條資料
ModelName.objects.all()[5:10]  # 第6到10條資料

(7) 聚合查詢 (aggregate)

用於執行聚合操作,例如求和、平均值等。

from django.db.models import Avg, Sum
ModelName.objects.aggregate(Avg('field_name'), Sum('field_name'))

比如:

# 獲取所有使用者年齡的平均值和總和
User.objects.aggregate(Avg('age'), Sum('age'))

(8) 去重 (distinct)

返回唯一值的結果集。

ModelName.objects.distinct()

(9) 計數 (count)

獲取查詢結果的數量。

ModelName.objects.count()

3. QuerySet 的特性

1. 延遲載入 (Lazy Loading)

QuerySet 不會立即執行查詢,只有當需要結果時才會執行。比如:

qs = User.objects.filter(age=18)  # 不執行查詢
users = list(qs)  # 此時才會查詢資料庫

2. 鏈式查詢

QuerySet 支援鏈式呼叫操作來構建複雜查詢。

User.objects.filter(age__gte=18).exclude(is_active=False).order_by('-last_login')

3. 不可變性

一旦 QuerySet 執行查詢,結果是不可更改的。如果需要新查詢,需要重新構建 QuerySet。

4. 高階用法

(1) Q物件

用於實現更復雜的查詢條件(如邏輯或、邏輯與)。

from django.db.models import Q
User.objects.filter(Q(age=18) | Q(is_active=True))

(2) F物件

用於比較同一個模型中兩個欄位的值。

from django.db.models import F
User.objects.filter(balance__gt=F('loan_amount'))

補充:

filter(balance__gt=F('loan_amount'))

  • balance__gt=F('loan_amount') 表示比較模型欄位 balance 和 loan_amount 的值,篩選出滿足條件 balance > loan_amount 的記錄。

    • balance__gt:表示 balance 大於某個值。

    • F('loan_amount'):表示將欄位 loan_amount 的值用作比較標準。

背後邏輯

Django ORM 將這段程式碼翻譯成 SQL 查詢:

SELECT * FROM user WHERE balance > loan_amount;

這會從資料庫中返回所有 balance 大於 loan_amount 的使用者。

相關文章