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

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

Django QuerySet查詢集原理及代碼實(shí)例

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

一 概念

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

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

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

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

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

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

二 兩大特性

1)惰性執(zhí)行

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

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

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

2)緩存

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

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

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

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

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

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

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

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

情況一:重復(fù)獲取查詢集對象中一個(gè)特定的索引將每次都查詢數(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)、可以對查詢集進(jìn)行取下標(biāo)或切片操作,等同于sql中的limit和offset子句。

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

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

示例:獲取第1、2項(xiàng),運(yùn)行查看。

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

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

簡單的使用if語句進(jìn)行判斷也會完全執(zhí)行整個(gè)queryset并且把數(shù)據(jù)放入cache,雖然你并不需要這些 數(shù)據(jù)!為了避免這個(gè),可以用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ù)就將其丟棄。

當(dāng)queryset非常巨大時(shí),cache會成為問題。

處理成千上萬的記錄時(shí),將它們一次裝入內(nèi)存是很浪費(fèi)的。更糟糕的是,巨大的queryset可能會鎖住系統(tǒng) 進(jìn)程,讓你的程序?yàn)l臨崩潰。要避免在遍歷數(shù)據(jù)的同時(shí)產(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,再次遍歷沒有打印,因?yàn)榈饕呀?jīng)在上一次遍歷(next)到最后一次了,沒得遍歷了for obj in objs: print(obj.title)

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

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

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

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文在线а√天堂| 久久三级福利| 中文久久精品| 欧洲一区二区三区精品| 精品国产一区二区三区性色av| 国产综合亚洲精品一区二| 国产va在线视频| 美女福利一区二区三区| 福利欧美精品在线| 岛国精品一区| 日韩国产在线| 国产精品天天看天天狠| 国产探花在线精品一区二区| 日韩黄色av| 国产日本久久| 国产一区二区三区不卡视频网站| 高清久久精品| 国产va免费精品观看精品视频| 久久99久久人婷婷精品综合| 九九99久久精品在免费线bt| 欧美成人a交片免费看| 欧美日韩中文一区二区| 午夜久久tv| 日韩视频不卡| av不卡免费看| 91精品国产自产精品男人的天堂 | 日本不卡在线视频| 日韩专区在线视频| 日韩精品午夜视频| 精品一区91| 婷婷综合社区| 91超碰国产精品| 欧美在线不卡| 99成人超碰| 日韩一区二区三区精品视频第3页| 日本午夜精品久久久| 黄色在线网站噜噜噜| 久久精品影视| 日韩精品一页| 国产精品一区二区中文字幕| 美女久久99| 国产综合色区在线观看| 亚洲精选成人| 亚洲免费福利| 日本成人中文字幕| 欧美亚洲国产精品久久| 日韩一区二区三免费高清在线观看| 91欧美在线| aa国产精品| 国产精品久久久久久久免费观看| 国产亚洲毛片| 你懂的亚洲视频| av免费不卡国产观看| 亚洲美女久久| 国精品产品一区| 精品一区免费| 另类欧美日韩国产在线| 蜜臀av亚洲一区中文字幕| 日韩av福利| 国产成人精品一区二区三区视频| 午夜亚洲福利| 一区二区精品| 视频一区二区三区中文字幕| 日韩中文首页| 国产成人免费av一区二区午夜| 国产伦乱精品| 国产精品一区二区三区av| 日日摸夜夜添夜夜添国产精品| 91久久视频| 亚洲欧美日韩视频二区| 四虎4545www国产精品| 91欧美日韩| 色婷婷综合网| 精品三级在线| 四季av一区二区凹凸精品| 欧美日韩a区| 国产欧美一级| 牛牛精品成人免费视频| 美女高潮久久久| 日本一区二区免费高清| 日韩深夜视频| 在线一区免费| 伊人久久亚洲| 青青国产精品| 亚洲人成在线网站| 久久精品国产大片免费观看| 99日韩精品| 国产精品伦一区二区| 久久av偷拍| 日本免费一区二区三区四区| 欧美福利一区| 国产一区久久| 日韩欧美中文字幕在线视频| 欧美啪啪一区| 欧美日韩尤物久久| 日韩中文字幕区一区有砖一区| 欧美日韩1区| 欧美三区四区| 日日夜夜免费精品视频| 国产精品久久久久久久免费观看 | 99久久久久| 天堂va在线高清一区| 精品一区二区三区中文字幕| 久久亚洲国产| 亚洲开心激情| 日韩精品麻豆| 欧美亚洲一区二区三区| 粉嫩av一区二区三区四区五区 | 国产精品久久观看| 亚洲制服一区| 欧美99久久| 国产成年精品| 国产精品1luya在线播放| 亚洲精品综合| 怡红院精品视频在线观看极品| 日本一区二区高清不卡| 国产精品1luya在线播放| 日本在线不卡视频一二三区| av一区二区高清| 日韩精选在线| 欧美日韩四区| 不卡中文一二三区| 国产精品地址| 欧美日韩一区二区三区不卡视频 | 五月激情久久| 国产精品夜夜夜| 欧美成人国产| 中文字幕人成乱码在线观看| 欧美片第1页综合| 91精品丝袜国产高跟在线| 91久久国产| 韩国精品主播一区二区在线观看 | 激情久久一区二区| 亚洲精品黄色| 亚洲午夜久久久久久尤物| 欧美国产先锋| 亚洲精品在线国产| 尹人成人综合网| 亚洲高清二区| 久久影院午夜精品| 久久精品国产999大香线蕉| 亚洲精品裸体| 亚洲人www| 日韩高清一区| 国产精品久久久久久av公交车| 亚洲人成亚洲精品| 一区二区三区四区在线观看国产日韩| 尹人成人综合网| 亚洲精品国产偷自在线观看| 国产亚洲欧洲| 亚洲欧洲日韩精品在线| 国产99精品| av亚洲在线观看| 午夜在线一区| 国产精品资源| 精品久久美女| 日韩欧美在线中字| 久久国产主播| 欧美日韩日本国产亚洲在线| 久久国产婷婷国产香蕉| 精品网站aaa| 成人日韩在线观看| 久久国产66| 麻豆视频久久| 日本高清不卡一区二区三区视频| 日韩欧美精品综合| sm久久捆绑调教精品一区| 国产亚洲精品久久久久婷婷瑜伽| 国产毛片一区| 日本午夜精品久久久久| 欧美日韩在线精品一区二区三区激情综合| 在线观看一区| 久久久久亚洲精品中文字幕| 老牛影视精品| 国产视频一区三区| 国产欧美日韩在线观看视频| 在线精品视频在线观看高清| 青青草精品视频| 久久久久国产精品一区三寸| 爽好多水快深点欧美视频| 国产精品99久久免费| 999精品色在线播放| 亚洲+小说+欧美+激情+另类| 狂野欧美性猛交xxxx| 亚洲二区免费| 久久成人亚洲| 九九久久电影| 精品三级久久久| 亚洲乱码久久| 亚洲福利免费| 亚洲高清毛片| 狂野欧美性猛交xxxx| 亚洲激情婷婷| 福利视频一区| 国产一二在线播放| 丝袜国产日韩另类美女| 欧美国产亚洲精品| 天堂久久一区| 日韩中出av| 亚洲一区二区日韩|