[TimLinux] django aggregate和annotate示例
1. 聚合与注解
聚合(aggregate)比较好理解,注解(annotate)真不好理解,这篇示例参考了文章“django中聚合aggregate和annotate GROUP BY的使用方法”提供的模型,以及部分内容。根据参考的文章,注解的理解是:在聚合的基础上使用了GROUP BY语句。
2. 模型代码
from django.db import models class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField() class Meta:
db_table = 'author' class Publisher(models.Model):
name = models.CharField(max_length=300)
num_awards = models.IntegerField() class Meta:
db_table = 'publisher' 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 Meta:
db_table = 'book' class Store(models.Model):
name = models.CharField(max_length=300)
books = models.ManyToManyField(Book)
registered_users = models.PositiveIntegerField() class Meta:
db_table = 'store'
3. aggregate
# 需要导入的模块
>>> from django.db.models import Count, Avg, Sum, F, FloatField
>>> from django.db import connections
>>> from books.models import * #1. 聚合返回的是字典值
统计计数
>>> Publisher.objects.aggregate(num_books=Count('book'))
>>> connections['default'].queries
SELECT
COUNT(`book`.`id`) AS `num_books`
FROM
`publisher` LEFT OUTER JOIN `book`
ON (`publisher`.`id` = `book`.`publisher_id`); 求平均
>>> Book.objects.all().aggregate(Avg('price'))
>>> Book.objects.aggregate(Avg('price'))
SELECT
AVG(`book`.`price`) AS `price__avg`
FROM
`book`; 求每页价格
>>> Book.objects.aggregate( price_per_page=Sum(F('price')/F('pages'), output_field=FloatField()) )
SELECT
SUM((`book`.`price` / `book`.`pages)) AS `price_per_page`
FROM
`book`;
4. annotate
对数据进行分组后,再聚合,使用annotate
# 导入涉及的模块
from django.db.models import Count, Sum, FloatField
from django.db import connections
from books.models import * # annotate是分组、聚合的含义,annotate返回的是新的queryset
# aggregate则是对全表进行聚合的含义,没有分组的概念,返回的是字典
>>> Book.objects.annotate(Count('authors')) # authors是Book中的属性
SELECT
`book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`,
`book`.`rating`, `book`.`publisher_id`, `book`.`pubdate`,
COUNT(`book_authors`.`author_id`) AS `authors__count`
FROM
`book`
LEFT OUTER JOIN
`book_authors`
ON
(`book`.`id` = `book_authors`.`book_id`)
GROUP BY
`book`.`id`
ORDER BY
NULL;
[TimLinux] django aggregate和annotate示例的更多相关文章
- django的聚合函数和aggregate、annotate方法使用
支持聚合函数的方法: 提到聚合函数,首先我们要知道的就是这些聚合函数是不能在django中单独使用的,要想在django中使用这些聚合函数,就必须把这些聚合函数放到支持他们的方法内去执行.支持聚合函数 ...
- aggregate和annotate方法使用详解与示例
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询.当我们需要对查询集(queryset)的某些字段进行计算或 ...
- 72.Python中ORM聚合函数详解:Avg,aggregate,annotate
聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...
- aggregate和annotate使用
aggregate和annotate方法的使用场景 Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的.当我们需要对查询集( ...
- django中聚合aggregate和annotate GROUP BY的使用方法
接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...
- Django的aggregate()和annotate()函数的区别
aggregate() aggregate()为所有的QuerySet生成一个汇总值,相当于Count().返回结果类型为Dict. annotate() annotate()为每一个QuerySet ...
- [TimLinux] django model关于QuerySet
1. 获取执行过的sql命令 from django.db import connections connections['default'].queries 2. 获取QuerySet将执行的sql ...
- Django ORM (四) annotate,F,Q 查询
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...
- python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,
python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...
随机推荐
- jquery jssdk分享报错解决方法
jssdk分享报错解决方法 一般都是参数传错了
- javascript监听手机返回键
javascript监听手机返回键 <pre> if (window.history && window.history.pushState) { $(window).on ...
- vue登录功能和将商品添加至购物车实现
2.1: 学子商城--用户登录 用户登录商城用户操作行为,操作用户输入用户名和密码 点击登录按钮,一种情况登录成功 一种情况登录失败 "用户名或密码有误请检查" 2.2:如何实现 ...
- Java程序线上故障排查
目录 一.Linux 内存和cpu 网络 磁盘 /proc文件系统 二.JVM Java堆和垃圾收集器 gc日志分析 JVMTI介绍 Attach机制 java自带工具 三.三方工具 jprofile ...
- JavaScript with Image:创建缩略图
当图片很大,直接把图片从Server下载到浏览器上看是一种很不明智的做法,浪费了服务器的资源,网络带宽和客户端的资源.所以,通常Server和Client之间会传输缩略图,只有当Client请求某张图 ...
- 那些年用过的UI开发平台
屈指算来,在我不长也不能算短的职业生涯中,接触了数代 的UI技术: MFC (Microsoft Foundation Class)- Win32上最强大的Class Library,没有之一.VS唯 ...
- Python连接SqlServer+GUI嵌入式——学生管理系统1.0
学生管理系统1.0 1.建学生数据库 2.数据库嵌入高级语言(Python) 3.界面设计 简化思路: 1.先通过SqlServer2012建立学生数据库,包括账号.密码,姓名.选课等信息 2.运用P ...
- tornado的使用-数据库篇
tornado的使用-数据库篇
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 7. SOFAJRaft源码分析—如何实现一个轻量级的对象池?
前言 我在看SOFAJRaft的源码的时候看到了使用了对象池的技术,看了一下感觉要吃透的话还是要新开一篇文章来讲,内容也比较充实,大家也可以学到之后运用到实际的项目中去. 这里我使用Recyclabl ...