django之ORM查询操作(二)
文章目錄
- 查詢集
- 基礎條件查詢--針對一個屬性
- F和Q對象
- 聚合函數
- 統計總的閱讀量
- 關聯查詢
- 基礎關聯查詢
- 內連接查詢
- 自關聯查詢
查詢集
查詢集:
- 表示從數據庫中獲取的模型對象集合
- 在管理器上調用過濾器方法會返回查詢集
- 查詢集可以含有0個、一個或多個過濾器
- 過濾器:基于所給的參數限制查詢的結果
返回列表的過濾器如下:
- all():返回所有的數據(以對象形式)
- filter():返回滿足條件的數據
- exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字
- order_by():返回排序后的數據
返回單個對象的過濾器如下:
- get():返回單個滿足條件的對象
- 如果未找到會引發"模型類.DoesNotExist"異常
- 如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常
- count():返回當前查詢的總條數
- aggregate():聚合
- exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False
查詢集特點
- 1.惰性執行:創建查詢集不會訪問數據庫,直到在模板中調用數據時,才會訪問數據庫
- 調用數據的情況包括迭代、序列化、與if合用
- 2.緩存:查詢集的結果被存下來之后,再次查詢相同數據時會使用之前緩存的數據
查詢集緩存
- 每個查詢集都包含一個緩存來最小化對數據庫的訪問
- 第一次查詢數據后,Django會將查詢集緩存起來,并返回請求的結果
- 再次查詢相同數據時將重用緩存的結果
限制查詢集
-
查詢集返回列表,可以使用下標的方式進行限制,等同于sql中的limit和offset子句
-
注意:不支持負數索引
-
使用下標后返回一個新的查詢集,不會立即執行查詢
-
如果獲取一個對象,直接使用[0],等同于[0:1].get()
-
但是如果沒有數據,[0]引發IndexError異常,[0:1].get()引發DoesNotExist異常
基礎條件查詢–針對一個屬性
查詢語法:模型屬性_條件運算符=值
- 說明:查詢語句是屬性名稱和比較運算符間使用兩個下劃線相連,所以定義的模型屬性名不能包括多個下劃線
- 實現sql中where的功能,可以調用過濾器filter()、exclude()、get()
查詢實現
- 1.查詢id為1的書籍 (exact : 判斷相等)
- 2.查詢書名包含‘湖’的書籍 (contains : 是否包含)
- 3.查詢書名以‘部’結尾的書籍 (startswith/endswith : 以什么開頭/以什么結尾)
- 4.查詢書名不為空的書籍 (isnull : 是否為null)
- 5.查詢編號為2或4的書籍(pk:主鍵/id) (in : 是否包含在范圍內)
- 6.查詢編號大于2的書籍(gt/大于、gte/大于等于、lt/小于、lte/小)
- 7.查詢id不等于3的書籍 (exclude : 條件以外的數據)
- 8.查詢1980年發表的書籍(year、month、day、week_day、hour、minute、second : 對日期時間類型的屬性進行運算)
- 9.查詢1990年1月1日后發表的書籍
提示:
-
exact、contains、startswith、endswith運算符都區分大小寫
-
在這些運算符前加上i表示不區分大小寫
-
如iexact、icontains、istartswith、iendswith
F和Q對象
F對象:用于兩個屬性的比較
語法:
-
F對象查詢需求
-
1.查詢閱讀量大于評論量的書籍
- 2.查詢閱讀量大于2倍評論量的書籍 : F對象支持運算
Q對象:多個過濾器逐個調用表示邏輯與關系,同sql語句中where部分的and關鍵字
Q對象語法:
from django.db.models import QQ(模型屬性1__條件運算符=值) | Q(模型屬性2__條件運算符=值)Q對象查詢需求
- 1.查詢閱讀量大于20,或編號小于3的圖書
- 2.查詢編號不等于3的書籍 (Q對象前可以使用~操作符,表示非not)
聚合函數
-
使用aggregate()過濾器調用聚合函數,返回單個對象
-
聚合函數包括:Avg,Max,Min,Sum,Count
-
使用Count時,一般不需要 aggregate()過濾器,直接調用即可
-
被定義在django.db.models中
統計總的閱讀量
from django.db.models import Sumdef bookList(request):# 查詢編號不等于3的書籍bookInfos = BookInfo.books.filter(~Q(id=3))# 統計總的閱讀量readcount = BookInfo.books.aggregate(Sum('readcount'))# 構造上下文context = {'booklist':bookInfos,'readcount':readcount}return render(request, 'Book/booklist.html', context)注意上下文字典取總閱讀量時的key的書寫規則
關聯查詢
基礎關聯查詢
-
1.查詢編號為1的圖書中所有人物信息
-
通過書找關聯的人
-
2.查詢編號為1的英雄出自的書籍
-
通過人找關聯的書
內連接查詢
語法如下 :
關聯模型類名小寫__屬性名__運算符=值-
結果和sql中的inner join相同(內連接)
-
1.查詢書名為"紅樓夢"的所有人物信息(peopleInfo)
-
通過書找關聯的人
-
2.查詢書籍中人物的描述包含"紅"的書籍
-
通過人找關聯的書
自關聯查詢
- 自關聯的表結構:對于地區信息、分類信息等數據,表結構非常類似,每個表的數據量十分有限,為了充分利用數據表的大量數據存儲功能,可以設計成一張表,內部的關系字段指向本表的主鍵
- 說明:關系屬性使用self指向本類,要求null和blank允許為空,因為一級數據是沒有父級的
參考鏈接
總結
以上是生活随笔為你收集整理的django之ORM查询操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django之ORM介绍与基本用法(一)
- 下一篇: SQL注入是什么?如何防止?