Django 聚合函數(shù)的具體使用
orm模型中的聚合函數(shù)跟MySQL中的聚合函數(shù)作用是一致的,也有像Sum、Avg、Count、Max、Min,接下來(lái)我們逐個(gè)介紹
聚合函數(shù)所有的聚合函數(shù)都是放在django.db.models下面。并且聚合函數(shù)不能夠單獨(dú)的執(zhí)行,聚合函數(shù)是通過(guò)aggregate方法來(lái)實(shí)現(xiàn)的。在說(shuō)明聚合函數(shù)的用法的時(shí)候,都是基于以下的模型對(duì)象來(lái)實(shí)現(xiàn)的。
class Author(models.Model): '''作者模型''' name = models.CharField(max_length=100) age = models.IntegerField() email = models.EmailField() class Meta: db_table = ’author’ class Publisher(models.Model): '''出版社模型''' name = models.CharField(max_length=300) class Meta: db_table = ’publisher’ class Book(models.Model): '''圖書(shū)模型''' name = models.CharField(max_length=300) pages = models.IntegerField() price = models.FloatField() rating = models.FloatField() author = models.ForeignKey(Author,on_delete=models.CASCADE) publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) class Meta: db_table = ’book’ class BookOrder(models.Model): '''圖書(shū)訂單模型''' book = models.ForeignKey('Book',on_delete=models.CASCADE) price = models.FloatField() class Meta: db_table = ’book_order’Avg
Avg:求平均值。比如想要獲取所有圖書(shū)的價(jià)格平均值。那么可以使用以下代碼實(shí)現(xiàn)。
from django.db.models import Avg result = Book.objects.aggregate(Avg(’price’)) print(result)
以上的打印結(jié)果是:
{'price__avg':23.0}
其中price__avg的結(jié)構(gòu)是根據(jù)field__avg規(guī)則構(gòu)成的。如果想要修改默認(rèn)的名字,那么可以將Avg賦值給一個(gè)關(guān)鍵字參數(shù)。示例代碼如下:
from django.db.models import Avg result = Book.objects.aggregate(my_avg=Avg(’price’)) print(result)
以上的打印結(jié)果為
{'my_avg':23}
CountCount:獲取指定的對(duì)象的個(gè)數(shù)。示例代碼如下:
from django.db.models import Count result = Book.objects.aggregate(book_num=Count(’id’))
以上的result將返回Book表中總共有多少本圖書(shū)。
Count類(lèi)中,還有另外一個(gè)參數(shù)叫做distinct,默認(rèn)是等于False,如果是等于True,那么將去掉那些重復(fù)的值。比如要獲取作者表中所有的不重復(fù)的郵箱總共有多少個(gè),那么可以通過(guò)以下代碼來(lái)實(shí)現(xiàn):
from djang.db.models import Countresult = Author.objects.aggregate(count=Count(’email’,distinct=True))Max和Min
Max和Min:獲取指定對(duì)象的最大值和最小值。比如想要獲取Author表中,最大的年齡和最小的年齡分別是多少。那么可以通過(guò)以下代碼來(lái)實(shí)現(xiàn):
from django.db.models import Max,Minresult = Author.objects.aggregate(Max(’age’),Min(’age’))
如果最大的年齡是90,最小的年齡是10。那么以上的result將為:
{'age__max':90,'age__min':10}
SumSum:求指定對(duì)象的總和。比如要求圖書(shū)的銷(xiāo)售總額。那么可以使用以下代碼實(shí)現(xiàn):
from djang.db.models import Sumresult = Book.objects.annotate(total=Sum('bookorder__price'))
以上的代碼annotate的意思是給Book表在查詢(xún)的時(shí)候添加一個(gè)字段叫做total,這個(gè)字段的數(shù)據(jù)來(lái)源是從BookOrder模型的price的總和而來(lái)。
aggregate和annotate的區(qū)別相同點(diǎn):這兩個(gè)方法都可以執(zhí)行聚合函數(shù)。
不同點(diǎn):
aggregate返回的是一個(gè)字典,在這個(gè)字典中存儲(chǔ)的是這個(gè)聚合函數(shù)執(zhí)行的結(jié)果。而annotate返回的是一個(gè)QuerySet對(duì)象,并且會(huì)在查找的模型上添加一個(gè)聚合函數(shù)的屬性。 aggregate不會(huì)做分組,而annotate會(huì)使用group by子句進(jìn)行分組,只有調(diào)用了group by子句,才能對(duì)每一條數(shù)據(jù)求聚合函數(shù)的值。F表達(dá)式:F表達(dá)式: 動(dòng)態(tài)的獲取某個(gè)字段上的值。并且這個(gè)F表達(dá)式,不會(huì)真正的去數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù),他相當(dāng)于只是起一個(gè)標(biāo)識(shí)的作用。比如想要將原來(lái)每本圖書(shū)的價(jià)格都在原來(lái)的基礎(chǔ)之上增加10元,那么可以使用以下代碼來(lái)實(shí)現(xiàn):
from django.db.models import FBook.objects.update(price=F('price')+10) Q表達(dá)式
Q表達(dá)式:使用Q表達(dá)式包裹查詢(xún)條件,可以在條件之間進(jìn)行多種操作。與/或非等,從而實(shí)現(xiàn)一些復(fù)雜的查詢(xún)操作。例子如下:
查找價(jià)格大于100,并且評(píng)分達(dá)到4.85以上的圖書(shū):
# 不使用Q表達(dá)式的 books = Book.objects.filter(price__gte=100,rating__gte=4.85) # 使用Q表達(dá)式的 books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))
查找價(jià)格低于100元,或者評(píng)分低于4分的圖書(shū):
books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))
獲取價(jià)格大于100,并且圖書(shū)名字中不包含”傳“字的圖書(shū):
books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains=’傳’))
到此這篇關(guān)于Django 聚合函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)Django 聚合函數(shù)內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 基于PHP做個(gè)圖片防盜鏈2. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)3. ASP.NET MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢(xún)、排序、分頁(yè)4. XML在語(yǔ)音合成中的應(yīng)用5. jscript與vbscript 操作XML元素屬性的代碼6. asp.net core 認(rèn)證和授權(quán)實(shí)例詳解7. ASP.NET MVC把數(shù)據(jù)庫(kù)中枚舉項(xiàng)的數(shù)字轉(zhuǎn)換成文字8. 如何使用ASP.NET Core 配置文件9. .NET中實(shí)現(xiàn)對(duì)象數(shù)據(jù)映射示例詳解10. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)車(chē)輛管理系統(tǒng)
