电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django 聚合函數(shù)的具體使用

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

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}

Count

Count:獲取指定的對(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}

Sum

Sum:求指定對(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)!

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 奥因-光触媒除甲醛公司-除甲醛加盟公司十大品牌 | 悬浮拼装地板_幼儿园_篮球场_悬浮拼接地板-山东悬浮拼装地板厂家 | 高压绝缘垫-红色配电房绝缘垫-绿色高压绝缘地毯-上海苏海电气 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 【北京写字楼出租_写字楼租赁_办公室出租网/出售】-远行地产官网 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 广东青藤环境科技有限公司-水质检测| 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 首页|成都尚玖保洁_家政保洁_开荒保洁_成都保洁 | 北钻固控设备|石油钻采设备-石油固控设备厂家 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 精密机械零件加工_CNC加工_精密加工_数控车床加工_精密机械加工_机械零部件加工厂 | 圈酒招商网【jiushuitv.com】_酒水招商_代理_加盟平台 | 一氧化氮泄露报警器,二甲苯浓度超标报警器-郑州汇瑞埔电子技术有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 高温高压釜(氢化反应釜)百科 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 新能源汽车教学设备厂家报价[汽车教学设备运营18年]-恒信教具 |