sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet
上一篇Django 2.1.7 模型 - 條件查詢 F對象 Q對象 聚合查詢講述了關于Django模型的介紹F對象、Q對象、聚合查詢等功能。
不管什么查詢,返回的結果都基本是查詢集QuerySet,如下:
In [16]: MiddlewareInfo.objects.all()Out[16]: 1)>, 2)>, MiddlewareInfo object (3)>, 4)>, 5)>, reInfo: MiddlewareInfo object (6)>, ...
其中查詢集具有緩存、返回多個值、返回單個值、對查詢集切片處理等功能。
參考文獻
https://docs.djangoproject.com/zh-hans/2.1/topics/db/queries/#caching-and-querysets
返回查詢集的過濾器如下:
- all():返回所有數據。
- filter():返回滿足條件的數據。
- exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字。
- order_by():對結果進行排序。
返回單個值的過濾器如下:
- get():返回單個滿足條件的對象
- 如果未找到會引發"模型類.DoesNotExist"異常。
- 如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常。
- count():返回當前查詢結果的總條數。
- aggregate():聚合,返回一個字典。
判斷某一個查詢集中是否有數據:
- exists():判斷查詢集中是否有數據,如果有則返回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
兩大特性
- 惰性執行:創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用。
- 緩存:使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后把結果緩存下來,再次使用這個查詢集時會使用緩存的數據。
查詢集的緩存
每個查詢集都包含一個緩存來最小化對數據庫的訪問。
在新建的查詢集中,緩存為空,首次對查詢集求值時,會發生數據庫查詢,django會將查詢的結果存在查詢集的緩存中,并返回請求的結果,接下來對查詢集求值將重用緩存中的結果。
示例一:經過存儲后,可以重用查詢集,第二次使用緩存中的數據。
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中執行SQL的次數只有第一次讀取的時候執行。mysql日志如下:
示例二:如下是兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載。
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的數據時,都進行這個查詢集的執行,所以mysql執行日志有兩次,如下:
限制查詢集
可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。
?注意:不支持負數索引。
”對查詢集進行切片后返回一個新的查詢集,不會立即執行查詢。
如果獲取一個對象,直接使用[0],等同于[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發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)>
總結
以上是生活随笔為你收集整理的sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android handler同步,an
- 下一篇: 一级计算机考试修改信息书面申请表,医院信