首頁技術文章正文

什么是查詢集?怎樣創(chuàng)建和使用查詢集?

更新時間:2021-09-13 來源:黑馬程序員 瀏覽量:

IT培訓班


查詢集表示從數據庫中獲取的對象集合,在管理器上調用過濾器方法會返回查詢集,查詢集可以含有零個、一個或多個過濾器過濾器基于所給的參數限制查詢的結果。

從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句

兩大特性

惰性執(zhí)行:創(chuàng)建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用

緩存:查詢集的結果被存下來之后,再次查詢時會使用之前緩存的數據

返回列表的過濾器如下:

all():返回所有數據

filter():返回滿足條件的數據

exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字

order_by():排序

返回單個值的過濾器如下:

get():返回單個滿足條件的對象

如果未找到會引發(fā)"模型類.DoesNotExist"異常

如果多條被返回,會引發(fā)"模型類.MultipleObjectsReturned"異常

count():返回當前查詢的總條數

aggregate():聚合

exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False

示例:查詢所有,編輯booktest/views.py的index視圖,運行查看

list=BookInfo.books.all()

查詢集


限制查詢集

查詢集返回列表,可以使用下標的方式進行限制,等同于sql中的limit和offset子句注意:不支持負數索引使用下標后返回一個新的查詢集,不會立即執(zhí)行查詢

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

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

list=BookInfo.books.all()[0:2]

查詢集

查詢集的緩存

每個查詢集都包含一個緩存來最小化對數據庫的訪問在新建的查詢集中,緩存為空,首次對查詢集求值時,會發(fā)生數據庫查詢,django會將查詢的結果存在查詢集的緩存中,并返回請求的結果,接下來對查詢集求值將重用緩存的結果演示:運行進行shell

python manage.py shell

情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載

from booktest.models import BookInfo
[book.id for book in BookInfo.books.all()]
[book.id for book in BookInfo.books.all()]

查詢集

查看數據庫日志

sudo vi /var/log/mysql/mysql.log

查詢集

情況二:經過存儲后,可以重用查詢集,第二次使用緩存中的數據

list=BookInfo.books.all()
[book.id for book in list]
[book.id for book in list]

查詢集

查看數據庫日志

sudo vi /var/log/mysql/mysql.log

查詢集





猜你喜歡:

Hadoop集群初體驗——經典單詞統(tǒng)計案例

bagging集成與boosting集成的區(qū)別是什么?

采集數據為什么選擇kafka?

什么是切片?切片的語法格式是怎樣的?

黑馬程序員Python大數據開發(fā)培訓

分享到:
在線咨詢 我要報名
和我們在線交談!