1. 程式人生 > >Django的查詢集QuerySet理解

Django的查詢集QuerySet理解

查詢集QuerySet

概念

Django的ORM中查詢集也稱結果集(QuerySet),就是從資料庫中獲取的物件集合
以下方法在Django中會返回查詢集(不是簡單的列表)

  • all() 返回所有資料
  • filter() 返回符合條件的資料
  • exclude() 返回符合條件之外的資料
  • order_by() 對結果進行排序
    對查詢集科研再次呼叫過濾器進行過濾如
>>> books = BookInfo.objects.filter(readcount__gt=30).order_by('pub_date')
>>> books
<QuerySet [<BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>

也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基於所給的引數限制查詢的結果。
從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。
判斷某一個查詢集中是否有資料:
exists():判斷查詢集中是否有資料,如果有則返回True,沒有則返回False。

兩大特性

惰性執行

建立查詢集不會訪問資料庫,直到呼叫資料時,才會訪問資料庫,呼叫資料的情況包括迭代、序列化、與if合用

例如,當執行如下語句時,並未進行資料庫查詢,只是建立了一個查詢集books

books = BookInfo.objects.all()

繼續執行遍歷迭代操作後,才真正的進行了資料庫的查詢

for book in books:
    print(book.name)

快取

使用同一個查詢集,第一次使用時會發生資料庫的查詢,然後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]

這裡寫圖片描述這裡寫圖片描述

限制查詢集

可以對查詢集進行取下標或切片操作,等同於sql中的limit和offset子句。

注意:不支援負數索引。

對查詢集進行切片後返回一個新的查詢集,不會立即執行查詢。

如果獲取一個物件,直接使用[0],等同於[0:1].get(),但是如果沒有資料,[0]引發IndexError異常,[0:1].get()如果沒有資料引發DoesNotExist異常。

示例:獲取第1、2項,執行檢視。

books = BookInfo.objects.all()[0:2]
books
<QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>]>