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使用Berkeley DB数据库实例
Sep 26 Python
讲解Python中的标识运算符
May 14 Python
window下eclipse安装python插件教程
Apr 24 Python
Python开发的HTTP库requests详解
Aug 29 Python
python模块之time模块(实例讲解)
Sep 13 Python
使用python3构建文件传输的方法
Feb 13 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Django中使用MySQL5.5的教程
Dec 18 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
聊聊python中的循环遍历
Sep 07 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 Python
Django分页器的用法你都了解吗
May 26 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
一个简单实现多条件查询的例子
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
详解vue axios二次封装
2018/07/22 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
python中self原理实例分析
2015/04/30 Python
Python线性方程组求解运算示例
2018/01/17 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
介绍一下JMS编程步骤
2015/09/22 面试题
预备党员公开承诺书
2014/05/28 职场文书
经理任命书模板
2014/06/06 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL