日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet

發(fā)布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上一篇Django 2.1.7 模型 - 條件查詢 F對象 Q對象 聚合查詢講述了關(guān)于Django模型的介紹F對象、Q對象、聚合查詢等功能。

不管什么查詢,返回的結(jié)果都基本是查詢集QuerySet,如下:

In [16]: MiddlewareInfo.objects.all()
Out[16]: 1)>, 2)>, MiddlewareInfo object (3)>, 4)>, 5)>, reInfo: MiddlewareInfo object (6)>, ...

其中查詢集具有緩存、返回多個值、返回單個值、對查詢集切片處理等功能。

參考文獻(xiàn)

https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#caching-and-querysets

返回查詢集的過濾器如下:

  • all():返回所有數(shù)據(jù)。
  • filter():返回滿足條件的數(shù)據(jù)。
  • exclude():返回滿足條件之外的數(shù)據(jù),相當(dāng)于sql語句中where部分的not關(guān)鍵字。
  • order_by():對結(jié)果進(jìn)行排序。

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

  • get():返回單個滿足條件的對象
    • 如果未找到會引發(fā)"模型類.DoesNotExist"異常。
    • 如果多條被返回,會引發(fā)"模型類.MultipleObjectsReturned"異常。
  • count():返回當(dāng)前查詢結(jié)果的總條數(shù)。
  • aggregate():聚合,返回一個字典。

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

  • exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False。
In [18]: MiddlewareInfo.objects.filter( server_id__exact = 2 )

Out[18]: 3)>, 4)>, MiddlewareInfo object (12)>, 13)>]>
In [19]: MiddlewareInfo.objects.filter( server_id__exact = 2 ).exists()
Out[19]: True
In [20]: MiddlewareInfo.objects.filter( server_id__exact = 3 )
Out[20]:
In [21]: MiddlewareInfo.objects.filter( server_id__exact = 3 ).exists()
Out[21]: False

兩大特性

  • 惰性執(zhí)行:創(chuàng)建查詢集不會訪問數(shù)據(jù)庫,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫,調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與if合用。
  • 緩存:使用同一個查詢集,第一次使用時會發(fā)生數(shù)據(jù)庫的查詢,然后把結(jié)果緩存下來,再次使用這個查詢集時會使用緩存的數(shù)據(jù)。

查詢集的緩存

每個查詢集都包含一個緩存來最小化對數(shù)據(jù)庫的訪問。

在新建的查詢集中,緩存為空,首次對查詢集求值時,會發(fā)生數(shù)據(jù)庫查詢,django會將查詢的結(jié)果存在查詢集的緩存中,并返回請求的結(jié)果,接下來對查詢集求值將重用緩存中的結(jié)果。

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

In [29]: list = MiddlewareInfo.objects.filter( server_id__exact = 2 )

In [30]: [ item.name for item in list ]
Out[30]: ['nginx', 'kafka', 'mysql', 'mongodb']

In [31]: [ item.name for item in list ]
Out[31]: ['nginx', 'kafka', 'mysql', 'mongodb']

使用這種方式讀取查詢集,訪問mysql中執(zhí)行SQL的次數(shù)只有第一次讀取的時候執(zhí)行。mysql日志如下:

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

In [32]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact = 2 ) ]
Out[32]: ['nginx', 'kafka', 'mysql', 'mongodb']

In [33]: [ item.name for item in MiddlewareInfo.objects.filter( server_id__exact = 2 ) ]
Out[33]: ['nginx', 'kafka', 'mysql', 'mongodb']

可以看到每次讀取list的數(shù)據(jù)時,都進(jìn)行這個查詢集的執(zhí)行,所以mysql執(zhí)行日志有兩次,如下:

限制查詢集

可以對查詢集進(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異常。

示例如下:

In [34]: MiddlewareInfo.objects.all()[0:2]
Out[34]: 1)>, 2)>]>
In [35]: MiddlewareInfo.objects.all()[0:1]
Out[35]: 1)>]>
In [36]: MiddlewareInfo.objects.all()[0]
Out[36]: 1)>

總結(jié)

以上是生活随笔為你收集整理的sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。