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深入学习之对象的属性
Aug 31 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python基础之包的导入和__init__.py的介绍
Jan 08 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
python pip源配置,pip配置文件存放位置的方法
Jul 12 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
Python字节单位转换实例
Dec 05 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Python实现简单的猜单词小游戏
Oct 28 Python
一起来学习Python的元组和列表
Mar 13 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
改变Apache端口等配置修改方法
2008/06/05 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
Vue实现日历小插件
2019/06/26 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
python开发之函数定义实例分析
2015/11/12 Python
20招让你的Python飞起来!
2016/09/27 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
python程序输出无内容的解决方式
2020/04/09 Python
基于python 凸包问题的解决
2020/04/16 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
python实现三壶谜题的示例详解
2020/11/02 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
2021/01/28 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
安全生产月活动总结
2014/05/04 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
六年级作文之关于梦
2019/10/22 职场文书
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS