在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 的使用者。