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 13 Python
python实现基本进制转换的方法
Jul 11 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
利用Python实现Shp格式向GeoJSON的转换方法
Jul 09 Python
Python列表list操作相关知识小结
Jan 29 Python
python中selenium库的基本使用详解
Jul 31 Python
Python自动化xpath实现自动抢票抢货
Sep 19 Python
Python3.9.1中使用match方法详解
Feb 08 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操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
php和asp语法上的区别总结
2019/05/12 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
PHP实现文件上传与下载
2020/08/28 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
JavaScript实现简单的计算器
2020/01/16 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python中__new__与__init__方法的区别详解
2015/05/04 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python随机数用法实例详解【基于random模块】
2017/04/18 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Python eval函数原理及用法解析
2020/11/14 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
中专生自我鉴定书范文
2013/12/28 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
golang的文件创建及读写操作
2022/04/14 Golang