亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Django 聚合函數的具體使用

瀏覽:6日期:2024-09-06 09:00:56
前言

orm模型中的聚合函數跟MySQL中的聚合函數作用是一致的,也有像Sum、Avg、Count、Max、Min,接下來我們逐個介紹

聚合函數

所有的聚合函數都是放在django.db.models下面。并且聚合函數不能夠單獨的執行,聚合函數是通過aggregate方法來實現的。在說明聚合函數的用法的時候,都是基于以下的模型對象來實現的。

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): '''圖書模型''' 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): '''圖書訂單模型''' book = models.ForeignKey('Book',on_delete=models.CASCADE) price = models.FloatField() class Meta: db_table = ’book_order’Avg

Avg:求平均值。比如想要獲取所有圖書的價格平均值。那么可以使用以下代碼實現。

from django.db.models import Avg result = Book.objects.aggregate(Avg(’price’)) print(result)

以上的打印結果是:

{'price__avg':23.0}

其中price__avg的結構是根據field__avg規則構成的。如果想要修改默認的名字,那么可以將Avg賦值給一個關鍵字參數。示例代碼如下:

from django.db.models import Avg result = Book.objects.aggregate(my_avg=Avg(’price’)) print(result)

以上的打印結果為

{'my_avg':23}

Count

Count:獲取指定的對象的個數。示例代碼如下:

from django.db.models import Count result = Book.objects.aggregate(book_num=Count(’id’))

以上的result將返回Book表中總共有多少本圖書。

Count類中,還有另外一個參數叫做distinct,默認是等于False,如果是等于True,那么將去掉那些重復的值。比如要獲取作者表中所有的不重復的郵箱總共有多少個,那么可以通過以下代碼來實現:

from djang.db.models import Countresult = Author.objects.aggregate(count=Count(’email’,distinct=True))Max和Min

Max和Min:獲取指定對象的最大值和最小值。比如想要獲取Author表中,最大的年齡和最小的年齡分別是多少。那么可以通過以下代碼來實現:

from django.db.models import Max,Minresult = Author.objects.aggregate(Max(’age’),Min(’age’))

如果最大的年齡是90,最小的年齡是10。那么以上的result將為:

{'age__max':90,'age__min':10}

Sum

Sum:求指定對象的總和。比如要求圖書的銷售總額。那么可以使用以下代碼實現:

from djang.db.models import Sumresult = Book.objects.annotate(total=Sum('bookorder__price'))

以上的代碼annotate的意思是給Book表在查詢的時候添加一個字段叫做total,這個字段的數據來源是從BookOrder模型的price的總和而來。

aggregate和annotate的區別

相同點:這兩個方法都可以執行聚合函數。

不同點:

aggregate返回的是一個字典,在這個字典中存儲的是這個聚合函數執行的結果。而annotate返回的是一個QuerySet對象,并且會在查找的模型上添加一個聚合函數的屬性。 aggregate不會做分組,而annotate會使用group by子句進行分組,只有調用了group by子句,才能對每一條數據求聚合函數的值。F表達式:

F表達式: 動態的獲取某個字段上的值。并且這個F表達式,不會真正的去數據庫中查詢數據,他相當于只是起一個標識的作用。比如想要將原來每本圖書的價格都在原來的基礎之上增加10元,那么可以使用以下代碼來實現:

from django.db.models import FBook.objects.update(price=F('price')+10) Q表達式

Q表達式:使用Q表達式包裹查詢條件,可以在條件之間進行多種操作。與/或非等,從而實現一些復雜的查詢操作。例子如下:

查找價格大于100,并且評分達到4.85以上的圖書:

# 不使用Q表達式的 books = Book.objects.filter(price__gte=100,rating__gte=4.85) # 使用Q表達式的 books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))

查找價格低于100元,或者評分低于4分的圖書:

books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.85))

獲取價格大于100,并且圖書名字中不包含”傳“字的圖書:

books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains=’傳’))

到此這篇關于Django 聚合函數的具體使用的文章就介紹到這了,更多相關Django 聚合函數內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
主站蜘蛛池模板: 加勒比一本大道香蕉在线视频 | 亚洲人成在线免费观看 | 国产精品亚洲专区在线观看 | 国产大量女主播精品视频 | 国产精品成人久久久久久久 | 晚上睡不着偷偷看b站免费是视频 | 一级一级毛片 | 国产在线视频二区 | 五月天婷婷在线视频国产在线 | 久久99精品视香蕉蕉 | 精品国产午夜久久久久九九 | 日本黄色不卡视频 | 国产人成精品 | 嗯啊在线观看免费影院 | 国产区香蕉精品系列在线观看不卡 | 一级aaaaaa毛片免费同男同女 | 国产小视频在线免费 | 久久国内精品自在自线软件 | 亚洲国产成人精彩精品 | 性生活视频网 | 深夜在线看片 | www.黄色网 | 在线观看免费黄网站 | 精品国产一区二区三区不卡 | 国内精品福利爱丝视频_速发 | 黄色录像日本 | 老妇毛片久久久久久久久 | 青青伊人精品 | 黄片毛片在线观看 | 大陆一级毛片 | 色在线国产 | 国产精品福利无圣光在线一区 | 日韩网站在线观看 | 二区在线视频 | 日本一级www | 网站啪啪| 亚洲一级色 | 美国黄色在线观看 | 四库影库免费永久在线 | 久久精品国产99国产精偷 | 国产精品亚洲精品日韩已满 |