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