Django ORM 聚合查询和分组查询实现详解


Posted in Python onAugust 09, 2019

models.py:

from django.db import models 
# 出版社
class Publisher(models.Model):
  id = models.AutoField(primary_key=True)
  name = models.CharField(max_length=64, null=False, unique=True)
 
  def __str__(self):
    return "<Publisher object: {}>".format(self.name) 
 
# 书籍
class Book(models.Model):
  id = models.AutoField(primary_key=True)
  title = models.CharField(max_length=64, null=False, unique=True)
  price = models.DecimalField(max_digits=5, decimal_places=2, default=00.00) # 最长位数为 5,小数位数为 2,默认值为 00.00
  publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 设置为 True
 
  def __str__(self):
    return "<Book object: {}>".format(self.title)
 
# 作者
class Author(models.Model):
  id = models.AutoField(primary_key=True)
  name = models.CharField(max_length=16, null=False, unique=True)
  book = models.ManyToManyField(to="Book") # 多对多关联 Book 表,ORM 会自动生成第 3 张表
 
  def __str__(self):
    return "<Author object: {}>".format(self.name)

book 表:

Django ORM 聚合查询和分组查询实现详解

修改 price

Django ORM 聚合查询和分组查询实现详解

聚合查询:

aggregate():返回一个包含一些键值对的字典。

键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

orm.py:

import os 
if __name__ == '__main__':
  # 加载 Django 项目的配置信息
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
  # 导入 Django,并启动 Django 项目
  import django
  django.setup() 
  from app01 import models 
  # 聚合查询需要导入的函数
  from django.db.models import Avg, Sum, Max, Min, Count 
  # 计算所有书籍 price 的平均值
  avg_ret = models.Book.objects.all().aggregate(Avg("price"))
  print(avg_ret) 
  # 计算所有书籍 price 的总和
  sum_ret = models.Book.objects.all().aggregate(Sum("price"))
  print(sum_ret) 
  # 计算所有书籍 price 的最大值
  max_ret = models.Book.objects.all().aggregate(Max("price"))
  print(max_ret) 
  # 计算所有书籍 price 的最小值
  min_ret = models.Book.objects.all().aggregate(Min("price"))
  print(min_ret) 
  # 计算所有书籍 price 的个数
  count_ret = models.Book.objects.all().aggregate(Count("price"))
  print(count_ret)

运行结果:

Django ORM 聚合查询和分组查询实现详解

生成的是字典类型

分组:

orm.py:

import os 
if __name__ == '__main__':
  # 加载 Django 项目的配置信息
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
  # 导入 Django,并启动 Django 项目
  import django
  django.setup() 
  from app01 import models 
  from django.db.models import Count 
  # 查询每一本书的作者个数
  ret = models.Book.objects.all().annotate(author_num=Count("author")) # 返回的是 book 对象,annotate(author_num) 相当于让 book 对象多了一个 author_num 字段
  print(ret)   
  for book in ret:
    print("书名:{},作者数:{}".format(book.title, book.author_num))

运行结果:

Django ORM 聚合查询和分组查询实现详解

这里的 book.annotate(author_num) 相当于让 book 对象多了一个 author_num 字段,但并不是在数据库中多了一个字段

orm.py:

import os 
if __name__ == '__main__':
  # 加载 Django 项目的配置信息
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
  # 导入 Django,并启动 Django 项目
  import django
  django.setup() 
  from app01 import models
  from django.db.models import Count 
  # 查询作者数大于 1 的书
  ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1)
  print(ret)

运行结果:

Django ORM 聚合查询和分组查询实现详解

orm.py:

import os 
if __name__ == '__main__':
  # 加载 Django 项目的配置信息
  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
  # 导入 Django,并启动 Django 项目
  import django
  django.setup() 
  from app01 import models 
  from django.db.models import Sum 
  # 查询各个作者出的书的总价格
  ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")) # 获取所有 author 表数据并添加 price_sum 字段 
  for i in ret:
    print(i, i.name, i.price_sum) # 打印所有 author 对象、 author 的 name 字段、price_sum 字段 的数据
  # 打印 author 表的所有 id、name、price_sum 字段数据
  print(ret.values_list("id", "name", "price_sum"))

运行结果:

Django ORM 聚合查询和分组查询实现详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的净值数据接口调用示例分享
Mar 15 Python
Python Socket传输文件示例
Jan 16 Python
python与php实现分割文件代码
Mar 06 Python
Python中几种导入模块的方式总结
Apr 27 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
在mac下查找python包存放路径site-packages的实现方法
Nov 06 Python
python 接收处理外带的参数方法
Dec 03 Python
python面向对象 反射原理解析
Aug 12 Python
python制作英语翻译小工具代码实例
Sep 09 Python
详解Python中的分支和循环结构
Feb 11 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 #Python
详解Python中的正斜杠与反斜杠
Aug 09 #Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 #Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
Aug 09 #Python
Django使用Jinja2模板引擎的示例代码
Aug 09 #Python
在Django admin中编辑ManyToManyField的实现方法
Aug 09 #Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 #Python
You might like
在PHP中执行系统外部命令
2006/10/09 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php strftime函数的详细用法
2018/06/21 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
PHP 8新特性简介
2020/08/18 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
女大学生自我鉴定
2013/12/09 职场文书
事假请假条范文
2014/04/11 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
产品售后服务承诺书
2014/05/21 职场文书
法制宣传标语
2014/06/23 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
农业项目建议书
2014/08/25 职场文书
课外小组活动总结
2014/08/27 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL