溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于Django中的ORM之查的案例

發(fā)布時(shí)間:2020-06-28 18:05:49 來(lái)源:億速云 閱讀:154 作者:清晨 欄目:編程語(yǔ)言

小編給大家分享一下關(guān)于Django中的ORM之查的案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

Django中的ORM之查:

1、對(duì)象查詢

 正向查找

res1=Book.objects.first()
print(res1.title)
print(res1.price)
print(res1.publish)
print(res1.publisher.name)#因?yàn)橐粚?duì)多的關(guān)系,所以res1.publisher是一個(gè)對(duì)象,不是一個(gè)QuerySet集合

反向查找

res2=Publish.objects.last()
print(res2.name)
print(res2.city)
print(res2.book_set.all())#res2.book_set是一個(gè)QuerySet集合,所以會(huì)打印集合中的所有對(duì)象元素

2、雙下劃綫(_)查詢

雙下劃線(__)之單表?xiàng)l件查詢

例子:

table1.objects.filter(id__lt=10,id__gt=1)#獲取id小于10,且大于1的記錄
table1.objects.filter(id__in=[11,22,33,44])#獲取id在[11,22,33,44]中的記錄
table1.objects.exclude(id__in=[11,22,33,44])#獲取id不在[11,22,33,44]中的記錄
table1.objects.filter(name__contains="content1")#獲取name中包含有"contents"的記錄(區(qū)分大小寫)
table1.objects.filter(name__icontains="content1")#獲取name中包含有"content1"的記錄(不區(qū)分大小寫)
table1.objects.filter(id__range=[1,4])#獲取id在1到4(不包含4)之間的的記錄

可使用的條件:

startswith# 指定開頭的匹配條件
istartswith# 指定開頭的匹配條件(忽略大小寫)
endswith# 指定結(jié)束的匹配條件
iendswith# 指定結(jié)束的匹配條件(忽略大小寫)

雙下劃線(__)之多表?xiàng)l件查詢

正向查找(條件)之一對(duì)一查詢

#查詢書名為"python"的書的id號(hào)res3=Book.objects.filter(title="python").values("id")
print(res3)

正向查找(條件)之一對(duì)多查詢

#查詢書名為"python"的書對(duì)應(yīng)的出版社的地址res4=Book.objects.filter(title="python").values("publisher__city")
print(res4)#查詢"aaa"作者所寫的所有的書的名字res5=Book.objects.filter(author__name="aaa").values("title")
print(res5)#查詢"aaa"作者所寫的所有的書的名字(與上面的用法沒區(qū)別)res6=Book.objects.filter(author__name="aaa").values("title")
print(res6)

反向查找之一對(duì)多查詢

#查詢出版了書名為"python"這本書的出版社的名字
res7=Publisher.objects.filter(book__title="python").values("name")
print(res7)
#查詢寫了書名為"python"的作者的名字
res8=Publisher.objects.filter(book__title="python").values("book__authors")
print(res8)

反向查找之多對(duì)多查詢

#查詢所寫的書名為"python"的作者的名字
res9=Author.objects.filter(bool__title="python").values("name")
print(res9)

條件查詢即與對(duì)象查詢對(duì)應(yīng),是指filter,values等方法中的通過__來(lái)明確查詢條件

3、聚合查詢和分組查詢

aggregate(*args,**kwargs)

通過到QuerySet進(jìn)行計(jì)算,返回一個(gè)聚合值的字典,aggregate()中的每一個(gè)參數(shù)都指定一個(gè)包含在字典中的返回值,即在查詢集合中生成聚合

例子:

from django.db.models import Avg,Max,Min,Sum#計(jì)算所有書籍的平均價(jià)格,書籍最高的價(jià)格和最低價(jià)格
res1=Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))
print(res1)#打印為"{'price__avg':xxx,'price__max':xxx,'price__min':xxx}"

Django的查詢語(yǔ)句提供了一種方式描述所有圖書的集合

aggregate()子句的參數(shù)可以指定想要計(jì)算的聚合值.
aggregate()是QuerySet的一個(gè)終止子句,返回一個(gè)包含一些鍵值對(duì)的字典.
字典的鍵的名稱是聚合值的標(biāo)識(shí)符,是按照字段和聚合函數(shù)的名稱自動(dòng)生成出來(lái)的.
字典的值是計(jì)算出來(lái)的聚合值.

可以為聚合值指定一個(gè)名稱.

#計(jì)算所有書籍的平均價(jià)格,并給書籍的平均價(jià)格起一個(gè)別名
res2=Book.objects.all().aggregate(average__price=Avg("price"))
print(res2)#打印為"{'average_price':xxx}"

annotate(*args,**kwargs)

可以通過計(jì)算查詢結(jié)果中每一個(gè)對(duì)象所關(guān)聯(lián)的對(duì)象集合,從而得出總計(jì)值(也可以是平均值或總和),即為查詢集的每一項(xiàng)生成聚合

#查詢作者"aaa"所寫的所有的書的名字
res3=Book.objects.filter(authors__name="aaa").values("title")
print(res3)
#查詢作者"bbb"所寫的所有的書的總價(jià)格
res4=Book.objects.filter(authors__name="bbb").aggregate(Sum("price"))
print(res4)

查詢各個(gè)作者所寫的書的總價(jià)格,就要使用分組

#查詢每個(gè)作者所寫的所有書籍的總價(jià)格
res5=Book.objects.values("authors__name").annotate(Sum("price"))
print(res5)
#查詢各個(gè)出版社所出版的書籍的總價(jià)格
res6=Book.objects.values("Publish__name").annotate(Min("price"))
print(res6)

4、F查詢和Q查詢

F查詢專門取對(duì)象中某列值的操作

#導(dǎo)入F
from django.db.models import F
#把table1表中的num列中的每一個(gè)值在的基礎(chǔ)上加10
table1.objects.all().update(num=F("num")+10)

Q構(gòu)建搜索條件

#導(dǎo)入Q
from django.db.models import Q

Q對(duì)象可以對(duì)關(guān)鍵字參數(shù)進(jìn)行封裝,從而更好的應(yīng)用多個(gè)查詢#查詢table2表中以"aaa"開頭的所有的title列

q1=table2.objects.filter(Q(title__startswith="aaa")).all()print(q1)

Q對(duì)象可以組合使用&,|操作符,當(dāng)一個(gè)操作符是用于兩個(gè)Q對(duì)象時(shí),會(huì)產(chǎn)生一個(gè)新的Q對(duì)象

#查找以"aaa"開頭,或者以"bbb"結(jié)尾的所有title
Q(title__startswith="aaa") | Q(title__endswith="bbb")

Q對(duì)象可以用"~"操作符放在表達(dá)式前面表示否定,也可允許否定與不否定形式的組合

#查找以"aaa"開頭,且不以"bbb"結(jié)尾的所有title
Q(title__startswith="aaa") & ~Q(title__endswith="bbb")

Q對(duì)象可以與關(guān)鍵字參數(shù)查詢一起使用,Q對(duì)象放在關(guān)鍵字查詢參數(shù)的前面

查詢條件:

#查找以"aaa"開頭,以"bbb"結(jié)尾的title且書的id號(hào)大于4的記錄
Q(title__startswith="aaa") | Q(title__endswith="bbb"),book_id__gt=4

看完了這篇文章,相信你對(duì)關(guān)于Django中的ORM之查的案例有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI