Django框架——查詢集QuerySet
阿新 • • 發佈:2018-11-04
目錄
1.概念
Django的ORM中存在查詢集的概念。
查詢集,也稱查詢結果集、QuerySet,表示從資料庫中獲取的物件集合。
當呼叫如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):
方法 | 描述 |
---|---|
all() | 返回所有資料。 |
filter() | 返回滿足條件的資料。 |
exclude() | 返回滿足條件之外的資料。 |
order_by() | 對結果進行排序。 |
從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。
exists():判斷查詢集中是否有資料,如果有則返回True,沒有則返回False。
2.兩大特性
(1)惰性執行:
建立查詢集不會訪問資料庫,直到呼叫資料時,才會訪問資料庫,呼叫資料的情況包括迭代、序列化、與if合用
例:
當執行如下語句時,並未進行資料庫查詢,只是建立了一個查詢集books
books = BookInfo.objects.all()
繼續執行遍歷迭代操作後,才真正的進行了資料庫的查詢
for book in books:
print(book.name)
(2)快取:
使用同一個查詢集,第一次使用時會發生資料庫的查詢,然後Django會把結果快取下來,再次使用這個查詢集時會使用快取的資料,減少了資料庫的查詢次數。
情況一:如下是兩個查詢集,無法重用快取,每次查詢都會與資料庫進行一次互動,增加了資料庫的負載。
from book.models import BookInfo [book.id for book in BookInfo.objects.all()] [book.id for book in BookInfo.objects.all()]
情況二:經過儲存後,可以重用查詢集,第二次使用快取中的資料。
books=BookInfo.objects.all()
[book.id for book in books]
[book.id for book in books]
3.限制查詢集
可以對查詢集進行取下標或切片操作,等同於sql中的limit和offset子句。
注意:不支援負數索引。對查詢集進行切片後返回一個新的查詢集,不會立即執行查詢。
用法:查詢集[x, y] (包頭不包尾)(從頭開始0可省略不寫)
例:獲取查詢集中前兩項
>>> books = BookInfo.objects.all()[0:2]
>>> books
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>]>