Django(18)聚合函数

Django(18)聚合函数前言orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum、Avg、Count、Max、Min,接下来我们逐个介绍聚合函数所有的聚合函数都是放在django.db.models

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像SumAvgCountMaxMin,接下来我们逐个介绍
 

聚合函数

所有的聚合函数都是放在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 Count
result = Author.objects.aggregate(count=Count('email',distinct=True))

 

Max和Min

Max和Min:获取指定对象的最大值和最小值。比如想要获取Author表中,最大的年龄和最小的年龄分别是多少。那么可以通过以下代码来实现:

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

如果最大的年龄是90,最小的年龄是10。那么以上的result将为:

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

 

Sum

Sum:求指定对象的总和。比如要求图书的销售总额。那么可以使用以下代码实现:

from djang.db.models import Sum
result = 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 F
Book.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='传'))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165460.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何防止僵尸进程?

    如何防止僵尸进程?1 僵尸进程 僵尸进程是当子进程比父进程先结束 而父进程又没有回收子进程 释放子进程占用的资源 此时子进程将成为一个僵尸进程 如果父进程先退出 子进程被 init 接管 子进程退出后 init 会回收其占用的相关资源 2 产生原因 a 子进程结束后向父进程发出 SIGCHLD 信号 父进程默认忽略了它 b 父进程没有调用 wait 或 waitpid 函数来等待子进程的结束 c 网络原

    2025年11月18日
    5
  • 普通最小二乘法回归 – OLS (ordinary least square)

    普通最小二乘法回归 – OLS (ordinary least square)前言这篇博客用来记录初学普通最小二乘回归遇到的相关知识点和解决问题的过程。开发环境:Python2.7IDLE普通最小二乘法回归回归-已有数据数据集:Cal_housing.csv简介:从1990年至今,美国加州所有街区人口普查的信息,关于9组变量,共20640个观测值。VariablesBolstols…

    2022年10月21日
    6
  • npm安装和卸载全局包

    其中install可以缩小为i例如:npmii5ting_toc-g

    2022年4月12日
    46
  • BP神经网络算法基本原理_卷积神经网络推导过程

    BP神经网络算法基本原理_卷积神经网络推导过程原文写于2018年5月。修改于2019年11月17。最近在学习《DeepLearning》这本书,书中在前馈神经网络、全连接神经网络以及卷积神经网络等内容中,都有提到反向传播算法,这一算法可以说是神经网络中求解参数比较核心的部分了。为了更好地理解神经网络工作的原理,认识反向传播在神经网络中的运算机制,在综合《DeepLearning》书中的有关部分并且学习了b站讲解神经网络的相关视频及一…

    2025年10月30日
    3
  • 关于开源的RTP——jrtplib的使用

    关于开源的RTP——jrtplib的使用

    2021年11月28日
    43
  • shell脚本之for循环语句_shell脚本if判断

    shell脚本之for循环语句_shell脚本if判断循环有:for、while、until什么是for循环呢?for循环逻辑:就是将循环列表中的元素赋值给变量,每次赋值便执行一次循环,done就标志着一个循环的结束。直到列表中的元素消耗殆尽,结束整个循环(也可以这么理解,因为某件事,你把你对象惹生气了,你是不是得道歉,道歉一次没用,是不是要第二遍,这是一个循环直到你对象原谅你这个循环才结束.也可以这么理解)for变量in值1值2值3do相当于大括号的上上半部分echo语句程序done相当于大括号的下半部分

    2025年5月31日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号