Django 聚合函数的具体使用

 更新时间:2021年05月19日 14:17:48   作者:Silent丿丶黑羽  
orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum、Avg、Count、Max、Min,接下来我们逐个介绍,下面就一起来了解一下

前言

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 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='传'))

到此这篇关于Django 聚合函数的具体使用的文章就介绍到这了,更多相关Django 聚合函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python openpyxl模块的使用详解

    python openpyxl模块的使用详解

    这篇文章主要介绍了python openpyxl模块的使用详解,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • Python 的字典(Dict)是如何存储的

    Python 的字典(Dict)是如何存储的

    这篇文章主要介绍了Python 的字典(Dict)是如何存储的,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • keras分类模型中的输入数据与标签的维度实例

    keras分类模型中的输入数据与标签的维度实例

    这篇文章主要介绍了keras分类模型中的输入数据与标签的维度实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python光学仿真学习衍射算法初步理解

    Python光学仿真学习衍射算法初步理解

    这篇文章主要为大家介绍了Python光学仿真学习中对衍射算法的初步理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • 树莓派+摄像头实现对移动物体的检测

    树莓派+摄像头实现对移动物体的检测

    这篇文章主要为大家详细介绍了树莓派+摄像头实现对移动物体的检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python读取csv文件分隔符设置方法

    Python读取csv文件分隔符设置方法

    今天小编就为大家分享一篇Python读取csv文件分隔符设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python使用Cv2模块识别验证码的操作方法

    Python使用Cv2模块识别验证码的操作方法

    这篇文章主要介绍了Python使用Cv2模块识别验证码,使用Cv2模块、pytesseract模块进行操作,pytesseract模块将智能识别图片字体数字,用于打印出来,本文通过代码案例给大家详细讲解,需要的朋友可以参考下
    2023-01-01
  • 详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    本文通过示例代码给大家详细介绍了Python3 中hasattr()、getattr()、setattr()、delattr()函数,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-04-04
  • Python+OpenCV之形态学操作详解

    Python+OpenCV之形态学操作详解

    这篇文章主要为大家详细介绍了Python OpenCV中的形态学操作(开运算、闭运算)的实现,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09
  • python爬虫之场内ETF基金获取

    python爬虫之场内ETF基金获取

    这篇文章主要介绍了python爬虫之场内ETF基金获取,ETF 是一种场内交易型基金,可以在盘中进行交易,交易性比场外基金强一点,下文基于python的相关资料展开,需要的小伙伴可以参考一下
    2022-05-05

最新评论