簡介
查詢集表示從數(shù)據(jù)庫中獲取的對(duì)象集合。查詢集可以含有零個(gè)、一個(gè)或多個(gè)過濾器。過濾器基于所給的參數(shù)限制查詢的結(jié)果。從Sql的角度,查詢集和select語句等價(jià),過濾器像where和limit子句
接下來主要介紹:查詢集、字段查詢(比較運(yùn)算符,F(xiàn)對(duì)象,Q對(duì)象)
查詢集
在管理器上調(diào)用過濾器方法會(huì)返回查詢集。查詢集經(jīng)過過濾器篩選后返回新的查詢集,因此可以寫成鏈?zhǔn)竭^濾。惰性執(zhí)行:創(chuàng)建查詢集不會(huì)帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)時(shí),才會(huì)訪問數(shù)據(jù)庫。何時(shí)對(duì)查詢集求值:迭代,序列化,與if合用
返回查詢集的方法,被稱為過濾器:
all()
filter()
exclude()
order_by()
values():一個(gè)對(duì)象構(gòu)成一個(gè)字典,然后構(gòu)成一個(gè)列表返回
返回單個(gè)值的方法:
get():返回單個(gè)滿足條件的對(duì)象
count():返回當(dāng)前查詢的總條數(shù)
first():返回第一個(gè)對(duì)象
last():返回最后一個(gè)對(duì)象
exists():判斷查詢集中是否有數(shù)據(jù),如果有測返回True
限制查詢集
查詢集返回列表,可以使用下標(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異常
查詢集的緩存
每個(gè)查詢集都包含一個(gè)緩存來最小化對(duì)數(shù)據(jù)庫的訪問
在新建的查詢集中,緩存為空,首次對(duì)查詢集求值時(shí),會(huì)發(fā)生數(shù)據(jù)庫查詢,django會(huì)將查詢的結(jié)果存在查詢集的緩存中,并返回請(qǐng)求的結(jié)果,接下來對(duì)查詢集求值將重用緩存的結(jié)果
情況一:這構(gòu)成了兩個(gè)查詢集,無法重用緩存,每次查詢都會(huì)與數(shù)據(jù)庫進(jìn)行一次交互,增加了數(shù)據(jù)庫的負(fù)載
print([e.title for e in Entry.objects.all()])? ?|? ? print([e.title for e in Entry.objects.all()])
情況二:兩次循環(huán)使用同一個(gè)查詢集,第二次使用緩存中的數(shù)據(jù)
querylist=Entry.objects.all()
print([e.title for e in querylist])? ? ? ? |? ? ? ?print([e.title for e in querylist])
何時(shí)查詢集不會(huì)被緩存:當(dāng)只對(duì)查詢集的部分進(jìn)行求值時(shí)會(huì)檢查緩存,但是如果這部分不在緩存中,那么接下來查詢返回的記錄將不會(huì)被緩存,這意味著使用索引來限制查詢集將不會(huì)填充緩存,如果這部分?jǐn)?shù)據(jù)已經(jīng)被緩存,則直接使用緩存中的數(shù)據(jù)
字段查詢
實(shí)現(xiàn)where子名,作為方法filter()、exclude()、get()的參數(shù)
語法:屬性名稱__比較運(yùn)算符=值。表示兩個(gè)下劃線,左側(cè)是屬性名稱,右側(cè)是比較類型。對(duì)于外鍵,使用“屬性名_id”表示外鍵的原始值。轉(zhuǎn)義:like語句中使用了%與,匹配數(shù)據(jù)中的%與,在過濾器中直接寫,例如:filter(title__contains="%")=>where title like '%\%%',表示查找標(biāo)題中包含%的
比較運(yùn)算符
exclude:返回不滿足條件的數(shù)據(jù) --->filter取反
BookInfo.book.exclude(id=3).count()查詢所有id不為3的圖書有多少本
exact:表示判等,大小寫敏感;如果沒有寫“比較運(yùn)算符”,表示判等
filter(id__exact=1) 其實(shí)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])查詢編號(hào)為1或2或3或4或5
gt、gte、lt、lte:大于、大于等于、小于、小于等于
filter(id__gt=3) 查詢id大于3
year、month、day、week_day、hour、minute、second:對(duì)日期間類型的屬性進(jìn)行運(yùn)算
filter(bpub_date__year=1980)? ? ? ?filter(bpub_date__gt=date(1980, 12, 31))
查詢的快捷方式:pk,pk表示primary key,默認(rèn)的主鍵是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對(duì)象
BookInfo.book.filter(bread__gt = F('bcomment'))查詢圖書閱讀量大于評(píng)論量的圖書信息
BookInfo.book.filter(bread__gt = F('bcomment')*2)查詢圖書閱讀量大于2倍的評(píng)論量的圖書信息
Q對(duì)象
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從小到大進(jìn)行排序。
BookInfo.book.all().order_by('-id').values()查詢所有圖書的信息,按照id從大到小進(jìn)行排序。