日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Django QuerySet查詢集原理及代碼實例

瀏覽:256日期:2024-09-29 11:05:17

一 概念

Django的ORM中存在查詢集的概念。

查詢集,也稱查詢結(jié)果集、QuerySet,表示從數(shù)據(jù)庫中獲取的對象集合。

當調(diào)用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):

all():返回所有數(shù)據(jù)。 filter():返回滿足條件的數(shù)據(jù)。 exclude():返回滿足條件之外的數(shù)據(jù)。 order_by():對結(jié)果進行排序。

對查詢集可以再次調(diào)用過濾器進行過濾,也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數(shù)限制查詢的結(jié)果。

從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。

二 兩大特性

1)惰性執(zhí)行

創(chuàng)建查詢集不會訪問數(shù)據(jù)庫,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫,調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與if合用

例如,當執(zhí)行如下語句時,并未進行數(shù)據(jù)庫查詢,只是創(chuàng)建了一個查詢集qs

# 查詢BookInfo模型類中的所有數(shù)據(jù)qs = BookInfo.objects.all() # 繼續(xù)執(zhí)行遍歷迭代操作后,才真正的進行了數(shù)據(jù)庫的查詢for book in qs: print(book.btitle)

2)緩存

使用同一個查詢集,第一次使用時會發(fā)生數(shù)據(jù)庫的查詢,然后Django會把結(jié)果緩存下來,再次使用這個查詢集時會使用緩存的數(shù)據(jù),減少了數(shù)據(jù)庫的查詢次數(shù)。

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

from booktest.models import BookInfo# 每個列表內(nèi)都為一個獨立的查詢集,兩次查詢集之間如果有數(shù)據(jù)插入,可能數(shù)據(jù)集會不同[book.id for book in BookInfo.objects.all()]

[book.id for book in BookInfo.objects.all()]

情況二:經(jīng)過存儲后,可以重用查詢集,第二次使用緩存中的數(shù)據(jù)。

# 首先獲得一個查詢集qs=BookInfo.objects.all()# 第一次讀取數(shù)據(jù),會查詢數(shù)據(jù)庫,然后增加緩存[book.id for book in qs]# 第二次讀取數(shù)據(jù),直接查詢緩存[book.id for book in qs]

3)何時查詢集不會被緩存?

查詢集不會永遠緩存它們的結(jié)果。當只對查詢集的部分進行求值時會檢查緩存, 如果這個部分不在緩存中,那么接下來查詢返回的記錄都將不會被緩存。所以,這意味著使用切片或索引來限制查詢集將不會填充緩存。

情況一:重復(fù)獲取查詢集對象中一個特定的索引將每次都查詢數(shù)據(jù)庫:

queryset = BookInfo.objects.all()

queryset[5] # 查詢數(shù)據(jù)庫queryset[5] # 再一次查詢數(shù)據(jù)庫

情況二:如果已經(jīng)對全部查詢集求值過,則將檢查緩存:

# 獲取查詢集queryset = BookInfo.objects.all()[entry for entry in queryset] # 查詢數(shù)據(jù)庫print queryset[5] # 使用緩存 print queryset[5] # 使用緩存

情況三:下面是一些其它例子,它們會使得全部的查詢集被求值并填充到緩存中:

# 獲取查詢集queryset = BookInfo.objects.all()[entry for entry in queryset]bool(queryset)entry in querysetlist(queryset)

注:簡單地打印查詢集不會填充緩存。

queryResult=models.Article.objects.all()print(queryResult) # 查詢數(shù)據(jù)庫print(queryResult) # 查詢數(shù)據(jù)庫 

三 限制查詢集

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

注意:不支持負數(shù)索引。對查詢集進行切片后返回一個新的查詢集,不會立即執(zhí)行查詢。

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

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

qs = BookInfo.objects.all()[0:2]

2)、exists()方法:判斷某一個查詢集中是否有數(shù)據(jù):

簡單的使用if語句進行判斷也會完全執(zhí)行整個queryset并且把數(shù)據(jù)放入cache,雖然你并不需要這些 數(shù)據(jù)!為了避免這個,可以用exists()方法,判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False。

if queryResult.exists():#SELECT (1) AS 'a' FROM 'blog_article' LIMIT 1; args=()print('exists...')

3)、terator()方法: 來獲取數(shù)據(jù),處理完數(shù)據(jù)就將其丟棄。

當queryset非常巨大時,cache會成為問題。

處理成千上萬的記錄時,將它們一次裝入內(nèi)存是很浪費的。更糟糕的是,巨大的queryset可能會鎖住系統(tǒng) 進程,讓你的程序瀕臨崩潰。要避免在遍歷數(shù)據(jù)的同時產(chǎn)生queryset cache,可以使用iterator()方法 來獲取數(shù)據(jù),處理完數(shù)據(jù)就將其丟棄。

objs = BookInfo.objects.all().iterator()# iterator()可以一次只從數(shù)據(jù)庫獲取少量數(shù)據(jù),這樣可以節(jié)省內(nèi)存for obj in objs: print(obj.title)#BUT,再次遍歷沒有打印,因為迭代器已經(jīng)在上一次遍歷(next)到最后一次了,沒得遍歷了for obj in objs: print(obj.title)

注:(1) 使用iterator()方法來防止生成cache,意味著遍歷同一個queryset時會重復(fù)執(zhí)行查詢。所以使 #用iterator()的時候要當心,確保你的代碼在操作一個大的queryset時沒有重復(fù)執(zhí)行查詢。

(2) queryset的cache是用于減少程序?qū)?shù)據(jù)庫的查詢,在通常的使用下會保證只有在需要的時候才會查詢數(shù)據(jù)庫。 使用exists()和iterator()方法可以優(yōu)化程序?qū)?nèi)存的使用。不過,由于它們并不會生成queryset cache,可能 會造成額外的數(shù)據(jù)庫查詢。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区第一页| 欧美国产精品| 中文字幕在线看片| 伊人久久视频| 日韩在线精品| 久久久国产精品一区二区中文| 日韩黄色大片| 另类中文字幕国产精品| 欧美.日韩.国产.一区.二区| 日韩啪啪电影网| 成人久久一区| 亚洲成人精选| 91精品国产自产在线观看永久∴| 亚洲手机视频| 性色一区二区| 国产亚洲精品美女久久| 国产精品视频一区视频二区| 大香伊人久久精品一区二区| 欧产日产国产精品视频| 国产伊人精品| 亚洲视频电影在线| 国产九一精品| 日韩一区二区在线免费| 亚洲在线国产日韩欧美| 97久久亚洲| 中文在线а√在线8| 香蕉国产精品| 日韩影院精彩在线| 日本欧美大码aⅴ在线播放| 久久一区欧美| 欧美成人综合| 久久国产精品免费一区二区三区 | 最近国产精品视频| 国产欧美日韩视频在线| 国产精品久久观看| 女同性一区二区三区人了人一| 丝袜美腿成人在线| 欧美国产另类| 国产精品av一区二区| 精品美女视频| 国产精品大片| 日韩va亚洲va欧美va久久| 亚洲一区二区免费看| 国产精品一区三区在线观看| 黄色成人91| 国精品一区二区| 日本在线一区二区三区| 日韩专区精品| 麻豆国产91在线播放| 91久久午夜| 亚洲精品动态| 最新国产精品| 高潮久久久久久久久久久久久久| 亚洲二区视频| 亚洲色图综合| 亚洲欧洲高清| 日韩福利视频导航| 99视频精品全部免费在线视频| 国产农村妇女精品一二区| 国产免费av一区二区三区| 女主播福利一区| 欧美精品1区| 国产午夜久久| 91精品国产乱码久久久久久久| 秋霞影院一区二区三区| 久久免费高清| 综合精品一区| 福利一区和二区| 日韩精品欧美精品| 日本91福利区| 91偷拍一区二区三区精品| 亚洲欧美日韩国产综合精品二区| 麻豆中文一区二区| 亚洲欧美日韩国产一区| 久久精品系列| 日韩综合一区二区三区| 久久久久99| 美女黄网久久| 日本va欧美va精品| jizzjizz中国精品麻豆| 久久香蕉精品| 91久久中文| 荡女精品导航| 五月婷婷亚洲| 国产黄色精品| 精品一区二区男人吃奶| 久久久精品五月天| 日韩精品高清不卡| 荡女精品导航| 免费观看在线综合色| 久久狠狠久久| 亚洲天堂黄色| 国产精品片aa在线观看| 亚洲黄色影院| 日本视频中文字幕一区二区三区| 嫩草伊人久久精品少妇av杨幂| 国产a亚洲精品| 国户精品久久久久久久久久久不卡| 欧美日韩伊人| 爽爽淫人综合网网站| 成人国产精品久久| 亚洲无线观看| 亚洲视频国产| 国产一区视频在线观看免费| 国产成人精品福利| 六月丁香综合在线视频| 97久久亚洲| 天堂av一区| 亚洲精品乱码久久久久久蜜桃麻豆| 在线亚洲免费| 亚洲激情国产| 亚洲激情二区| 波多野结衣一区| 秋霞国产精品| 国产精品二区不卡| 久久精品福利| 精品国产一区二区三区性色av| 国产私拍福利精品视频二区| 亚洲久草在线| 亚洲精品在线二区| 日本亚州欧洲精品不卡| 亚洲影视一区二区三区| 免费在线欧美视频| 麻豆精品91| 中文字幕一区二区三区日韩精品 | 中文字幕一区二区三区四区久久| 亚洲经典在线| 久久av一区| 四虎国产精品免费久久| 中文字幕一区二区三区四区久久| 欧美综合二区| 亚洲综合婷婷| 欧美亚洲网站| 麻豆高清免费国产一区| 日本一区二区免费高清| 丝袜美腿一区| 99国内精品| 免费一区二区视频| 亚洲精品一级二级三级| 日本精品一区二区三区在线观看视频| 亚洲在线免费| 日本不卡视频在线| 精品国产免费人成网站| 激情欧美丁香| 亚洲精品极品| 国产精品最新| 黑人精品一区| 国产精品美女| 日本不卡高清视频| 美女av一区| 国产麻豆久久| 免费在线观看视频一区| 欧美在线精品一区| 国产一区一一区高清不卡| 日本久久成人网| 国产视频欧美| 日本欧美在线| 新版的欧美在线视频| 久久丁香四色| 日本久久成人网| 亚洲精品在线二区| 老色鬼精品视频在线观看播放| 国产一区二区三区四区| 国产韩日影视精品| 日本va欧美va精品| 国产+成+人+亚洲欧洲在线| 亚洲一级网站| 欧美一区久久| 99视频精品全国免费| 婷婷精品久久久久久久久久不卡| 日韩黄色免费网站| 国产不卡精品在线| 午夜精品婷婷| 欧美在线不卡| 国产综合色区在线观看| 亚洲尤物av| 久久久久久网| 亚洲久久视频| 福利片在线一区二区| 免费日韩精品中文字幕视频在线| 国产精品一区二区中文字幕| 99久久久久久中文字幕一区| 日韩欧美中文字幕电影| 亚洲精品**中文毛片| 视频一区欧美精品| 国产精品玖玖玖在线资源| 99热国内精品| 国产精品美女久久久久久不卡 | 精品久久97| 玖玖精品视频| 日韩成人精品一区二区| 视频在线观看91| 福利一区视频| 日韩av一区二| 亚洲免费黄色| 精品视频在线你懂得| 亚洲精品成人| 国产一区二区三区日韩精品| 男人的天堂亚洲一区| 成人国产精品一区二区网站|