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;

最新文章

  1. php_codesninffer phpcs用法学习使用:
  2. jdbc 4.0新特性
  3. 100726C
  4. React组件
  5. Unity3D Function Not Supported - Unity动画事件提示不支持的解决方法
  6. Argument list too long......
  7. JavaScript设置右下角悬浮窗
  8. jquery 插件大全
  9. 超强1000 JQuery插件
  10. 【linux】工作中linux系统常用命令操作整理
  11. 2-2、安装Filebeat
  12. c/c++ 多线程 等待一次性事件 异常处理
  13. 单链表反转java代码
  14. 新买苹果电脑,mac系统中小白应该了解哪些东西?
  15. StackService.Redis 应用
  16. eclipse工具类及插件(修改eclipse.ini文件及作者名字)
  17. 05-迪米特法则(LOD 又名: 最少知道原则)
  18. ubuntu 电源管理
  19. js匿名自执行函数中闭包的高级使用(---------------------------******-----------------------------)
  20. Lua编程

热门文章

  1. css3 input placeholder颜色修改方法
  2. jQuery 触发事件 移动端和pc端的区别
  3. .NET Core 对龙芯的支持情况和对 .NET Core 开发嵌入式的思考
  4. 删除Linux的依赖库并进入救援模式恢复
  5. 利用GitHub Pages + jekyll快速搭建个人博客
  6. 通过ESP8266调节继电器时间
  7. mysql中int、bigint、smallint、tinyint 长度
  8. class继承关键字extends和super
  9. 微信小程序使用 ECharts 实现数据可视化
  10. 新闻实时分析系统-Flume数据采集准备