簡介
查詢集表示從數(shù)據(jù)庫中獲取的對象集合范嘱。查詢集可以含有零個送膳、一個或多個過濾器员魏。過濾器基于所給的參數(shù)限制查詢的結(jié)果。從Sql的角度肠缨,查詢集和select語句等價逆趋,過濾器像where和limit子句
接下來主要介紹:查詢集、字段查詢(比較運算符晒奕,F(xiàn)對象闻书,Q對象)
查詢集
在管理器上調(diào)用過濾器方法會返回查詢集。查詢集經(jīng)過過濾器篩選后返回新的查詢集脑慧,因此可以寫成鏈式過濾魄眉。惰性執(zhí)行:創(chuàng)建查詢集不會帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)時闷袒,才會訪問數(shù)據(jù)庫坑律。何時對查詢集求值:迭代,序列化囊骤,與if合用
返回查詢集的方法晃择,被稱為過濾器:
all()
filter()
exclude()
order_by()
values():一個對象構(gòu)成一個字典,然后構(gòu)成一個列表返回
返回單個值的方法:
get():返回單個滿足條件的對象
count():返回當前查詢的總條數(shù)
first():返回第一個對象
last():返回最后一個對象
exists():判斷查詢集中是否有數(shù)據(jù)也物,如果有測返回True
限制查詢集
查詢集返回列表宫屠,可以使用下標的方式進行限制,等同于sql中的limit和offset子句滑蚯。注意:不支持負數(shù)索引浪蹂。使用下標后返回一個新的查詢集,不會立即執(zhí)行查詢告材。如果獲取一個對象坤次,直接使用[0],等同于[0:1].get()斥赋,但是如果沒有數(shù)據(jù)缰猴,[0]引發(fā)IndexError異常,[0:1].get()引發(fā)DoesNotExist異常
查詢集的緩存
每個查詢集都包含一個緩存來最小化對數(shù)據(jù)庫的訪問
在新建的查詢集中疤剑,緩存為空洛波,首次對查詢集求值時,會發(fā)生數(shù)據(jù)庫查詢骚露,django會將查詢的結(jié)果存在查詢集的緩存中,并返回請求的結(jié)果缚窿,接下來對查詢集求值將重用緩存的結(jié)果
情況一:這構(gòu)成了兩個查詢集棘幸,無法重用緩存谊却,每次查詢都會與數(shù)據(jù)庫進行一次交互母剥,增加了數(shù)據(jù)庫的負載
print([e.title for e in Entry.objects.all()])? ?|? ? print([e.title for e in Entry.objects.all()])
情況二:兩次循環(huán)使用同一個查詢集洲炊,第二次使用緩存中的數(shù)據(jù)
querylist=Entry.objects.all()
print([e.title for e in querylist])? ? ? ? |? ? ? ?print([e.title for e in querylist])
何時查詢集不會被緩存:當只對查詢集的部分進行求值時會檢查緩存定拟,但是如果這部分不在緩存中,那么接下來查詢返回的記錄將不會被緩存蹋嵌,這意味著使用索引來限制查詢集將不會填充緩存育瓜,如果這部分數(shù)據(jù)已經(jīng)被緩存,則直接使用緩存中的數(shù)據(jù)
字段查詢
實現(xiàn)where子名栽烂,作為方法filter()躏仇、exclude()、get()的參數(shù)
語法:屬性名稱__比較運算符=值腺办。表示兩個下劃線焰手,左側(cè)是屬性名稱,右側(cè)是比較類型怀喉。對于外鍵书妻,使用“屬性名_id”表示外鍵的原始值。轉(zhuǎn)義:like語句中使用了%與躬拢,匹配數(shù)據(jù)中的%與躲履,在過濾器中直接寫,例如:filter(title__contains="%")=>where title like '%\%%'聊闯,表示查找標題中包含%的
比較運算符
exclude:返回不滿足條件的數(shù)據(jù) --->filter取反
BookInfo.book.exclude(id=3).count()查詢所有id不為3的圖書有多少本
exact:表示判等工猜,大小寫敏感;如果沒有寫“比較運算符”馅袁,表示判等
filter(id__exact=1) 其實exact也可以省略filter(id=1)
contains:是否包含域慷,大小寫敏感
filter(name__contains='傳') 查詢名字里包含傳的
filter(name__startswith='傳')查詢以傳開頭的
filter(name__endswith='王').values() 查詢以王為結(jié)尾的
isnull空值查詢
filter(btitle__isnull=False)查詢不為空的值
in:范圍查詢
filter(id_in=[1,2,3,4,5])查詢編號為1或2或3或4或5
gt、gte汗销、lt犹褒、lte:大于、大于等于弛针、小于叠骑、小于等于
filter(id__gt=3) 查詢id大于3
year、month削茁、day宙枷、week_day、hour茧跋、minute慰丛、second:對日期間類型的屬性進行運算
filter(bpub_date__year=1980)? ? ? ?filter(bpub_date__gt=date(1980, 12, 31))
查詢的快捷方式:pk,pk表示primary key瘾杭,默認的主鍵是id
filter(pk__lt=6)
聚合函數(shù)
使用aggregate()函數(shù)返回聚合函數(shù)的值诅病。函數(shù):Avg,Count,Max贤笆,Min蝇棉,Sum
from django.db.models import Max
BookInfo.book.aggregate(Max('age')) 查詢年齡最大的
F對象
BookInfo.book.filter(bread__gt = F('bcomment'))查詢圖書閱讀量大于評論量的圖書信息
BookInfo.book.filter(bread__gt = F('bcomment')*2)查詢圖書閱讀量大于2倍的評論量的圖書信息
Q對象
BookInfo.book.filter(Q(id__gt=3)|Q(bread__gt=30))查詢id大于3或者閱讀量大于30的圖書信息
BookInfo.book.filter(~Q(id=3))查詢id不等于3圖書的信息
order_by
BookInfo.book.all().order_by('id')查詢所有圖書的信息,按照id從小到大進行排序芥永。
BookInfo.book.all().order_by('-id').values()查詢所有圖書的信息篡殷,按照id從大到小進行排序。