聚合函数:

如果你用原生SQL语句,则可以使用聚合函数提取数据。比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg。
聚合函数是通过aggregate方法来实现的,在讲解这些聚合函数的用法的时候,都是基于以下的模型来实现的。

示例代码如下:

'''python
#模型要放在app当中。所以首先要在终端命令行窗口,执行命令:
python manage.py startapp front
同时要将新创建的app添加到settings.py文件中的INSTALLED_APPS变量中。
同时要配置完全pycharm和数据库的连接信息。
settings.py文件中示例代码如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm_aggregate_demo',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
models.py文件中示例代码如下:
from django.db import models
# 定义作者的模型
class Author(models.Model):
<!-- 指定unique=True,规定字段的唯一性 -->
name = models.CharField(max_length=30, unique=True)
age = models.IntegerField()
email = models.EmailField() class Meta:
db_table = 'author' # 定义出版社模型
class Publisher(models.Model):
<!-- 指定unique=True,规定字段的唯一性 -->
name = models.CharField(max_length=100, unique=True) class Meta: db_table = 'publisher' # 定义一个图书模型
class Book(models.Model):
<!-- 指定unique=True,规定字段的唯一性 -->
name = models.CharField(max_length=100, unique=True)
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' 终端命令行窗口,执行命令:python manage.py makemigrations(生成相应的迁移脚本)和python manage.py migrate(将生成的迁移脚本映射到数据库中。)

1.aggregate()方法:

1. Avg:求平均值函数,如果想要获取图书的价格平均值,那么就可以使用以下代码实现:

导入模型

from .models import Book
from django.db.models import Avg
from django.http import HttpResponse
# views.py文件中:
def index(request):
# 聚合函数要放在aggregate()方法中,还有其他的能够执行聚合函数的方法,之后会进行讲解
result = Book.objects.aggregate(Avg('price'))
print(result)

此时打印出的输出结果就是:

{"price__avg": 价格}

“price__avg”是根据field__avg规则构成的,如果想要修改默认的名字,那么可以将Avg赋值给一个关键字参数。

示例代码如下:

from django.db.models import Avg

	result = Book.objects.aggregate(my_avg=Avg('price'))
print(result)

此时打印出的输出结果就是:

{"my_avg": 价格}

同时我们可以打印出查询的原生SQL语句

from django.db import connection

def inex(request):
result = Book.objects.aggregate(Avg('price'))
print(connection.queries)
# queries中存储了很多的SQL语句。
# 不能够通过print(result.query),进行打印SQL语句。
# 因为result为dict类型,没有query属性。
print(type(result))
1.所有聚合函数都是放在'django.db.models'下面。
2.聚合函数不能够够单独执行,必须放在能够执行聚合函数的方法中去执行,比如“aggregate()”方法。
3.在执行聚合函数的时候,会给这个聚合函数取个名字,取名字的规则,默认是“field__聚合函数名”。如果不想使用默认的名字,可以在执行聚合函数的时候传递进去关键字参数,示例代码如下:
	result = Book.objects.aggregate(avg=Avg("price"))
4.如果想要查看执行查询操作的sql语句的话,就要导入connection了,因为执行aggregate()方法返回的是字典类型的值,但是如果想要调用query查看原生sql语句的话,执行调用的对象必须是QuerySet类型的对象,而字典没有query属性。但是我们可以通过django.db import connection,进而就可以调用connection.queries。示例代码如下:
from django.db import connection
from .models import Book
from django.http import HttpResponse
from django.db.models import Avg def index(request):
result = Book.objects.aggregate(Avg('price'))
print(connection.queries)
return HttpResponse("success!")

2. Count:获取指定对象的个数,示例代码如下:

导入模型

result = Book.objects.aggregate(book_num=Count('id'))

此时就会返回Book表中图书的数量.

3.annotate()方法:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Author,Publisher,Book,BookOrder
from django.db.models import Avg,Count,Sum
from django.db import connection def index(request):
# 计算同一种书的预定平均价格,使用annotate()方法执行聚合函数,可以进行分组(group by)
# 由父类和子类的模型关系我们知道,子类通过外键的关系了父类,那么django就会在底层为父类添加一个名为子类名字小写形式的方法。
books = Book.objects.annotate(avg=Avg("bookorder__price"))
# print(books)
# 打印出结果:<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>]>
# 结果显示的是QuerySet类型,可以通过遍历得到具体的图书相关信息
for book in books:
print("%s,%s,平均价格:%s" % (book.name,book.author,book.avg))
# 打印出结果:
# 三国演义,罗贯中,47,312587329@qq.com,平均价格:101.5
# 水浒传,施耐庵,57,1924572@qq.com,平均价格:107.5
# 红楼梦,曹雪芹,42,123521472@qq.com,平均价格:102.0
# 西游记,吴承恩,34,193452272@qq.com,平均价格:None print(connection.queries)
# 打印出结果:[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, AVG(`book_order`.`price`) AS `avg` FROM `book` LEFT OUTER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL LIMIT 21', 'time': '0.000'}] return HttpResponse("success !")

aggregate和annotate的区别:

1.aggregate:返回的是字典类型的数据,默认情况下,键名为聚合函数操作的字段名__聚合函数名,键所对应的值就是聚合函数返回的值了。但是aggregate()方法不会返回QuerySet。
2.annotate:在原来模型的基础上欠佳一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)。如果在求图书的销售总额的话,那么将在每条图书的数据上都添加一个字段叫做total,计算这本书的销售总额。而如果使用的是aggregate,那么将求出所有图书的销售总额。
其中,aggregate()方法返回的是一个字典,字典中的值就是执行聚合函数的值,而annotate()方法返回的是一个“QuerySet”对象,并且会在查找的模型上添加一个聚合函数的属性。annotate()方法会使用“group by”字句进行分组,只有调用了“group by”字句,才能对每一条数据求聚合函数的值。而aggregate()方法不能调用“group by”字句。

72.Python中ORM聚合函数详解:Avg,aggregate,annotate的更多相关文章

  1. 75.Python中ORM聚合函数详解:Sum

    Sum:某个字段的总和. 1. 求图书的销售总额,示例代码如下: from django.http import HttpResponse from django.db import connecti ...

  2. 73.Python中ORM聚合函数详解:Count

    Count:用来求某个数据的个数. 在以下所有的示例中所采用的模型为: from django.db import models # 定义作者模型 class Author(models.Model) ...

  3. 74.Python中ORM聚合函数详解:Max,Min

    Max和Min:获取指定对象的最大值和最小值. 1. 比如:想要获取Author表中的最大的年龄和最小的年龄.示例代码如下: from django.http import HttpResponse ...

  4. python中的 zip函数详解

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple ...

  5. python中的buildin函数详解(第一篇)

    这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...

  6. python中的builtin函数详解-第二篇

    classmethod(function) 这里不过多说明这个builtin方法的具体用法,python的文档和help函数已经给了这个方法充足的使用说明,所以我这里要说的时关于 classmetho ...

  7. Python中的getattr()函数详解

    最近看Dive into python第四章自省中提到getattr()函数,作为一个内建函数平时自己没怎么用过所以也不太理解这个函数的一些用法 看了下函数本身的doc getattr(object, ...

  8. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  9. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

随机推荐

  1. selenium抓取淘宝数据报错:warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless

    ssh://root@192.168.33.12:22/root/anaconda3/bin/python3 -u /www/python3/maoyantop100/meishi_selenium. ...

  2. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:将悬停的颜色应用在行或者单元格上

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:让按钮看起来像个链接 (仍然保留按钮行为)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 微信小程序中,如何点击链接跳转到外部网页

    跳转到内部链接 这个我们应该都知道,通过wx.navigateTo,wx.redirectTo,wx.swtichTab等小程序内部的方法,可以直接跳转到小程序内部已经注册的(就是在app.json中 ...

  5. KDE Plasma 5.17 即将发布

    导读 Plasma 5.17上个月达到了beta版本,而下周将发布Plasma 5.17.0版本!KDE桌面的大更新只有几天了.因此,开发人员一直在整理它,同时也集思广益讨论Plasma 5.18应该 ...

  6. HTTP和HTTPS的区别,SSL的握手过程

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  7. Django 3.0 中连接mysql 8.0,可以不使用pymysql ,升级Mysqlclient即可

    python 中,连接mysql一般都推荐用pymysql ,而且在django中,网上的教程都是这么连接mysql的. import pymysql pymysql.install_as_MySQL ...

  8. crm业务流程图(精简版)

    网址:https://www.processon.com/view/link/5e0be839e4b0aef94cbcee28#map如果链接失效,请及时反馈(在评论区评论),博主会及时更新

  9. 工作中一些常用的linux命令

    问题一: 绝对路径用什么符号表示?当前目录.上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 答案:绝对路径:如/etc/init.d当前目录和上层目录:./  ../主目录:~/切换目录 ...

  10. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...