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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python实现的Excel文件读写类
Jul 30 Python
简析Python的闭包和装饰器
Feb 26 Python
Python生成密码库功能示例
May 23 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
python设置环境变量的作用和实例
Jul 09 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
pytorch 如何使用batch训练lstm网络
May 28 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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二维数组排序的函数分享
2014/01/17 PHP
php分页代码学习示例分享
2014/02/20 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
JS 继承实例分析
2008/11/04 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
百度地图api如何使用
2015/08/03 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python同时遍历数组的索引和值的实例
2018/11/15 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
房地产销售经理岗位职责
2014/01/01 职场文书
自我鉴定怎么写
2014/01/12 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
四议两公开实施方案
2014/03/28 职场文书
机械专业求职信范文
2014/07/15 职场文书
小学教师个人总结
2015/02/05 职场文书
召开会议通知范文
2015/04/15 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
交通事故调解协议书
2015/05/20 职场文书
职工宿舍管理制度
2015/08/05 职场文书
Golang解析JSON对象
2022/04/30 Golang
MySQL 字符集 character
2022/05/04 MySQL