Django 的 QuerySet結果集,兩大特性 惰性查詢,限制查詢集

查詢集QuerySet

1 概念

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。

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子句。

注意:不支持負數索引。

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

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

  • 示例:獲取第1、2項,運行查看。

    books = BookInfo.objects.all()[0:2]
    books
    
    <QuerySet [<BookInfo: 射鵰英雄傳>, <BookInfo: 天龍八部>]>
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章