最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年06月13日 11:28:22   投稿:yaominghui  
這篇文章主要介紹了Django QuerySet查詢集原理及代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一 概念

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

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

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

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

對查詢集可以再次調(diào)用過濾器進(jìn)行過濾,也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數(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合用

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

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

2)緩存

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

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

from booktest.models import BookInfo
# 每個列表內(nèi)都為一個獨(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ù)。

# 首先獲得一個查詢集
qs=BookInfo.objects.all()

# 第一次讀取數(shù)據(jù),會查詢數(shù)據(jù)庫,然后增加緩存
[book.id for book in qs]
# 第二次讀取數(shù)據(jù),直接查詢緩存
[book.id for book in qs]

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

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

  情況一:重復(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 queryset
list(queryset)

  注:簡單地打印查詢集不會填充緩存?! ?/p>

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)行切片后返回一個新的查詢集,不會立即執(zhí)行查詢。

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

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

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

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

  簡單的使用if語句進(jìn)行判斷也會完全執(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ù)就將其丟棄。

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

  處理成千上萬的記錄時,將它們一次裝入內(nèi)存是很浪費(fèi)的。更糟糕的是,巨大的queryset可能會鎖住系統(tǒng) 進(jìn)程,讓你的程序瀕臨崩潰。要避免在遍歷數(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()的時候要當(dāng)心,確保你的代碼在操作一個大的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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Python查找誰刪了你的微信

    詳解Python查找誰刪了你的微信

    微信好友長時間不聯(lián)系就可能被對方刪除,但是微信也不會主動通知你。那么我們就來用python寫一個工具查驗一下誰刪除了你的微信
    2022-02-02
  • python妹子圖簡單爬蟲實例

    python妹子圖簡單爬蟲實例

    這篇文章主要介紹了python妹子圖簡單爬蟲,實例分析了Python爬蟲程序所涉及的頁面源碼獲取、進(jìn)度顯示、正則匹配等技巧,需要的朋友可以參考下
    2015-07-07
  • Python全角與半角之間相互轉(zhuǎn)換的方法總結(jié)

    Python全角與半角之間相互轉(zhuǎn)換的方法總結(jié)

    全角與半角轉(zhuǎn)換在處理漢語語料中會經(jīng)常出現(xiàn),這里分別說明漢字、數(shù)字、字母的unicode編碼范圍,下面這篇文章主要給大家介紹了關(guān)于Python全角與半角之間相互轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python中的字典遍歷備忘

    Python中的字典遍歷備忘

    這篇文章主要介紹了Python中的字典遍歷備忘,本文列舉了多種字典遍歷方法,適合初學(xué)者查看,并簡單講解了interitems和iterms區(qū)別,需要的朋友可以參考下
    2015-01-01
  • 解決PyCharm無法使用lxml庫的問題(圖解)

    解決PyCharm無法使用lxml庫的問題(圖解)

    這篇文章主要介紹了解決PyCharm無法使用lxml庫的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • selenium+python實現(xiàn)文件上傳操作的方法實例

    selenium+python實現(xiàn)文件上傳操作的方法實例

    文件上傳功能是我們在日常開發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于selenium+python實現(xiàn)文件上傳操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python中第三方庫Requests庫的高級用法詳解

    Python中第三方庫Requests庫的高級用法詳解

    雖然Python的標(biāo)準(zhǔn)庫中urllib2模塊已經(jīng)包含了平常我們使用的大多數(shù)功能,但是它的API使用起來讓人實在感覺不好。它已經(jīng)不適合現(xiàn)在的時代,不適合現(xiàn)代的互聯(lián)網(wǎng)了。而Requests的誕生讓我們有了更好的選擇。本文就介紹了Python中第三方庫Requests庫的高級用法。
    2017-03-03
  • Celery+django+redis異步執(zhí)行任務(wù)的實現(xiàn)示例

    Celery+django+redis異步執(zhí)行任務(wù)的實現(xiàn)示例

    本文主要介紹了Celery+django+redis異步執(zhí)行任務(wù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Windows下PyCharm配置Anaconda環(huán)境(超詳細(xì)教程)

    Windows下PyCharm配置Anaconda環(huán)境(超詳細(xì)教程)

    這篇文章主要介紹了Windows下PyCharm配置Anaconda環(huán)境,本文給大家分享一篇超詳細(xì)教程,通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • opencv?canny邊緣檢測算法詳解

    opencv?canny邊緣檢測算法詳解

    本文主要介紹了opencv?canny邊緣檢測算法詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

繁峙县| 临西县| 监利县| 镇雄县| 南岸区| 大理市| 桦川县| 偏关县| 岳池县| 手游| 如皋市| 龙江县| 无锡市| 高陵县| 宜良县| 重庆市| 广昌县| 彭泽县| 兴安县| 军事| 青川县| 阳山县| 襄城县| 抚州市| 缙云县| 荆州市| 民权县| 英吉沙县| 沙田区| 肇东市| 连山| 嫩江县| 思茅市| 仲巴县| 陆川县| 商丘市| 湘西| 凌海市| 合川市| 孟连| 台安县|