首页 > 其他分享 >Django笔记十六之aggregate聚合操作

Django笔记十六之aggregate聚合操作

时间:2023-04-27 21:34:44浏览次数:45  
标签:聚合 models price 笔记 Django Book aggregate Avg

本文首发于公众号:Hunter后端 原文链接:Django笔记十六之aggregate聚合操作

这一篇笔记介绍一下关于聚合的操作,aggregate。

常用的聚合操作比如有平均数,总数,最大值,最小值等等

用到的 model 如下



class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()


class Publisher(models.Model):
    name = models.CharField(max_length=300)


class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.FloatField()
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    pubdate = models.DateField()


class Store(models.Model):
    name = models.CharField(max_length=300)
    books = models.ManyToManyField(Book)

聚合函数

  • Avg —— 平均数
  • Count —— 总数
  • Max —— 最大值
  • Min —— 最小值
  • Sum —— 总数

output_field —— 指定输出的数据格式

以下介绍一下几种聚合操作的例子,因为 Avg,Max,Min 都是一样的操作方法,所以用一个函数来做示例。

获取表中最大值:

from django.db.models import Max, Min, Avg

Book.objects.all().aggregate(Avg('price'))

对应的 SQL 为:

select avg(price) from blog_book;

返回的值为:

{'price__avg': Decimal('5.500000')}

指定聚合类型返回

因为 Book 中的 price 字段是 Decimal 字段,所以聚合之后返回的数据类型也是这个类型,如果想要更换成 Float 类型,可以用上 output_field 来指定输出类型:

Book.objects.all().aggregate(Avg('price', output_field=models.FloatField()))

返回的结果就是:

{'price__avg': 5.5}

指定聚合字段名称

Book.objects.aggregate(avg_price=Avg("price"))

以上用的示例都是 Avg 平均数,更换成 最大值 Max,最小值 Min 都是可以的

多个聚合操作

假设我们不止需要平均数,还需要最大值,最小值等等,我们可以在一个语句里直接操作

from django.db.models import Avg, Max, Min
Book.objects.aggregate(avg_price=Avg("price"), max_price=Max("price"), min_price=Min("price"))

关联表的聚合操作

对于 Store model,他有一个多对多的 book 的关系,如果想获取 Store 数据里,关联的 Book 的最大的 Book 的 price 数据:

Store.objects.aggregate(min_price=Min("books__price"))

如果有多个表链式关联,也可以直接链式聚合获取:

Store.objects.aggregate(youngest_age=Min("books__authors__age"))

以上就是本篇笔记的全部内容,其实还有一些聚合的操作,是关于 annotate 的一些用法示例,这里不多赘述,有时间可以单独开一个专门的笔记。

下一篇笔记将会对 SQL 中的 group by 用法在Django 中的对应操作做一个整体介绍。

标签:聚合,models,price,笔记,Django,Book,aggregate,Avg
From: https://blog.51cto.com/u_16061969/6232112

相关文章

  • FFT笔记
    FFT笔记前言:这个算法对于我来讲比较抽象、高深,因为里面涉及了一些复数等一些对我而言很难很难的知识。终于,花了几节文化课的时间冥思苦想,终于算是搞懂一点了。所以我决定趁脑子清醒的时候记录下来。与其他文章不同的是,本文可能没有太多的公式证明,主要是以通俗易懂的方式去讲......
  • Django笔记三十二之session登录验证操作
    本文首发于公众号:Hunter后端原文链接:Django笔记三十二之session登录验证操作这一篇笔记将介绍session相关的内容,包括如何在系统中使用session,以及利用session实现登录认证的功能。这篇笔记将分为以下几个内容:session的使用流程session的配置和相关方法users模块......
  • nginx+uwsgi+django安装配置
    一、安装Nginxsudoapt-getinstallnginx更改/etc/nginx/sites-enabled/default文件 添加内容:server { listen8080; #server_name127.0.0.1 charsetUTF-8; access_log/var/log/nginx/......
  • CDQ分治学习笔记
    CDQ分治学习笔记目录CDQ分治学习笔记前言CDQ分治思想例题1、翻转对分析codeP3810三维偏序(陌上花开)输入格式输出格式样例#1样例输入#1样例输出#1提示分析code前言之前在gdkoi讲解是有人用\(CDQ\)分治A了day1T3。好像分治FFT要用到,而且其他人都学过了,所以蒟蒻再次恶补一手......
  • 0/1分数规划学习笔记
    #0/1分数规划学习笔记——bysunzz3183------------##介绍$0/1$分数规划是指,给定整数$a_1,a_2,\cdots,a_n,b_1,b_2,\cdots,b_n$,求一组解$x_i,x_i\in\left\{0,1\right\}$,使下面的式子最大化:$$\frac{\sum_{i=1}^{n}a_i\timesx_i}{\sum_{i=1}^{n}b_i\timesx_i......
  • 读书笔记-《人件集》-2
    第二个是改善工作环境。工作环境的质量直接关系开发者的效率。一般来说,除了新手,经验对产出效率影响不大。反倒是,和身边的人有关;如果他们表现好,你也会自然表现好。这也就是环境同化,好的工作环境真的很重要。好的工作环境:工作空间宽敞、光亮、安静、具有私密性、不容易受到打扰并且......
  • Python学习笔记
    第二章变量和简单数据类型2.1字符串2.1.1使用方法修改字符串的大小写str.title():以首字母大写显示每个单词str.upper():字符串全部改成大写str.lower():字符串全部改成小写2.1.2删除空白str.rstrip():删除字符串末尾的空白str.lstrip():删除字符串开头的空白str.strip():......
  • 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU
    为了更好的阅读体验,请点击这里由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细。5.1层和块事实证明,研究讨论“比单个层大”但“比整个模型小”的组件更有价值。例如,在计算机视觉中广泛流行的ResNet-152架构就有数百层,这些层是由层组(groupsoflayers)的重复模......
  • 数学笔记
    反演和容斥反演本质反演形如\(f(n)=\sum\limits_{i=0}^na_ig(i)\iffg(n)=\sum\limits_{i=0}^nb_if(i)\)。实质是:两个函数(数列)之间的双向(求和)关系。如果定义一个关系矩阵\(\mathcalA\),满足\(f(n)=\sum\limits_{i=0}^ng(i)\mathcalA_{i,n}\),考虑其实质是向量\([f_0,f_1,\d......
  • 整体二分学习笔记
    整体二分引入对于一堆询问,如果每个单独的询问都可以二分解决的话,时间复杂度为\(O(NM\logN)\),但实际上每次二分都会有一些残留信息被我们扔掉,如果我们将所有询问一起二分,就可以最大时间的减小复杂度。讲解经典例题:区间第k大给定一个序列a和一个整数S,有2种操作:1.将a......