創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
目前創(chuàng)新互聯(lián)建站已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計、惠農(nóng)網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。小編給大家分享一下關(guān)于Django中的ORM之查的案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
Django中的ORM之查:
1、對象查詢
正向查找
res1=Book.objects.first() print(res1.title) print(res1.price) print(res1.publish) print(res1.publisher.name)#因為一對多的關(guān)系,所以res1.publisher是一個對象,不是一個QuerySet集合
反向查找
res2=Publish.objects.last() print(res2.name) print(res2.city) print(res2.book_set.all())#res2.book_set是一個QuerySet集合,所以會打印集合中的所有對象元素
2、雙下劃綫(_)查詢
雙下劃線(__)之單表條件查詢
例子:
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é)束的匹配條件(忽略大小寫)
雙下劃線(__)之多表條件查詢
正向查找(條件)之一對一查詢
#查詢書名為"python"的書的id號res3=Book.objects.filter(title="python").values("id") print(res3)
正向查找(條件)之一對多查詢
#查詢書名為"python"的書對應(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)
反向查找之一對多查詢
#查詢出版了書名為"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)
反向查找之多對多查詢
#查詢所寫的書名為"python"的作者的名字 res9=Author.objects.filter(bool__title="python").values("name") print(res9)
條件查詢即與對象查詢對應(yīng),是指filter,values等方法中的通過__來明確查詢條件
3、聚合查詢和分組查詢
aggregate(*args,**kwargs)
通過到QuerySet進(jìn)行計算,返回一個聚合值的字典,aggregate()中的每一個參數(shù)都指定一個包含在字典中的返回值,即在查詢集合中生成聚合
例子:
from django.db.models import Avg,Max,Min,Sum#計算所有書籍的平均價格,書籍最高的價格和最低價格 res1=Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price")) print(res1)#打印為"{'price__avg':xxx,'price__max':xxx,'price__min':xxx}"
Django的查詢語句提供了一種方式描述所有圖書的集合
aggregate()子句的參數(shù)可以指定想要計算的聚合值. aggregate()是QuerySet的一個終止子句,返回一個包含一些鍵值對的字典. 字典的鍵的名稱是聚合值的標(biāo)識符,是按照字段和聚合函數(shù)的名稱自動生成出來的. 字典的值是計算出來的聚合值.
可以為聚合值指定一個名稱.
#計算所有書籍的平均價格,并給書籍的平均價格起一個別名 res2=Book.objects.all().aggregate(average__price=Avg("price")) print(res2)#打印為"{'average_price':xxx}"
annotate(*args,**kwargs)
可以通過計算查詢結(jié)果中每一個對象所關(guān)聯(lián)的對象集合,從而得出總計值(也可以是平均值或總和),即為查詢集的每一項生成聚合
#查詢作者"aaa"所寫的所有的書的名字 res3=Book.objects.filter(authors__name="aaa").values("title") print(res3) #查詢作者"bbb"所寫的所有的書的總價格 res4=Book.objects.filter(authors__name="bbb").aggregate(Sum("price")) print(res4)
查詢各個作者所寫的書的總價格,就要使用分組
#查詢每個作者所寫的所有書籍的總價格 res5=Book.objects.values("authors__name").annotate(Sum("price")) print(res5) #查詢各個出版社所出版的書籍的總價格 res6=Book.objects.values("Publish__name").annotate(Min("price")) print(res6)
4、F查詢和Q查詢
F查詢專門取對象中某列值的操作
#導(dǎo)入F from django.db.models import F #把table1表中的num列中的每一個值在的基礎(chǔ)上加10 table1.objects.all().update(num=F("num")+10)
Q構(gòu)建搜索條件
#導(dǎo)入Q from django.db.models import Q
Q對象可以對關(guān)鍵字參數(shù)進(jìn)行封裝,從而更好的應(yīng)用多個查詢#查詢table2表中以"aaa"開頭的所有的title列
q1=table2.objects.filter(Q(title__startswith="aaa")).all()print(q1)
Q對象可以組合使用&,|操作符,當(dāng)一個操作符是用于兩個Q對象時,會產(chǎn)生一個新的Q對象
#查找以"aaa"開頭,或者以"bbb"結(jié)尾的所有title Q(title__startswith="aaa") | Q(title__endswith="bbb")
Q對象可以用"~"操作符放在表達(dá)式前面表示否定,也可允許否定與不否定形式的組合
#查找以"aaa"開頭,且不以"bbb"結(jié)尾的所有title Q(title__startswith="aaa") & ~Q(title__endswith="bbb")
Q對象可以與關(guān)鍵字參數(shù)查詢一起使用,Q對象放在關(guān)鍵字查詢參數(shù)的前面
查詢條件:
#查找以"aaa"開頭,以"bbb"結(jié)尾的title且書的id號大于4的記錄 Q(title__startswith="aaa") | Q(title__endswith="bbb"),book_id__gt=4
看完了這篇文章,相信你對關(guān)于Django中的ORM之查的案例有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!