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中的一些高级编程技巧
Apr 02 Python
Python实现决策树C4.5算法的示例
May 30 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
python让列表倒序输出的实例
Jun 25 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
Mar 08 Python
python 读取.nii格式图像实例
Jul 01 Python
实例讲解Python 迭代器与生成器
Jul 08 Python
Python Merge函数原理及用法解析
Sep 16 Python
详解python对象之间的交互
Sep 29 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
php4的彩蛋
2006/10/09 PHP
php Mysql日期和时间函数集合
2007/11/16 PHP
php中删除字符串中最先出现某个字符的实现代码
2013/02/03 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP最常用的正则表达式
2017/02/13 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
Javascript 类与静态类的实现
2010/04/01 Javascript
jQuery的学习步骤
2011/02/23 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
javascript的delete运算符知识点总结
2019/11/19 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Django进阶之CSRF的解决
2018/08/01 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
初中英语教学反思
2014/01/25 职场文书
建筑总经理岗位职责
2014/02/02 职场文书
装饰活动策划方案
2014/02/11 职场文书
护士个人自我鉴定
2014/03/24 职场文书
优秀团支部申报材料
2014/12/26 职场文书
车间主任岗位职责
2015/02/03 职场文书
团委工作总结2015
2015/04/02 职场文书
听证会主持词
2015/07/03 职场文书
nginx限制并发连接请求数的方法
2021/04/01 Servers
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
spring cloud 配置中心native配置方式
2021/09/25 Java/Android