sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet
上一篇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。
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android handler同步,an
- 下一篇: 一级计算机考试修改信息书面申请表,医院信