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中类的一些方法分析
Sep 25 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
python添加模块搜索路径方法
Sep 11 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
解析Python3中的Import
Oct 13 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
Django使用Profile扩展User模块方式
May 14 Python
python如何导入依赖包
Jul 13 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
python快速安装OpenCV的步骤记录
Feb 22 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将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
pymongo中group by的操作方法教程
2019/03/22 Python
pycharm运行scrapy过程图解
2019/11/22 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
django ORM之values和annotate使用详解
2020/05/19 Python
python判断正负数方式
2020/06/03 Python
快递业务员岗位职责
2014/01/06 职场文书
业务员自荐信范文
2014/04/20 职场文书
初中生评语大全
2014/04/24 职场文书
高中学生期末评语
2014/04/25 职场文书
心得体会的写法
2014/09/05 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
教师考核表个人总结
2015/02/12 职场文书
2015年工会工作总结
2015/03/30 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书