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爬取国外天气预报网站的方法
Jul 10 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
对Python协程之异步同步的区别详解
Feb 19 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
python之pexpect实现自动交互的例子
Jul 25 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
Django数据统计功能count()的使用
Nov 30 Python
浅谈Python类的单继承相关知识
May 12 Python
pytorch实现手写数字图片识别
May 20 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 Python
Python读取和写入Excel数据
Apr 20 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下MYSQL limit的优化
2008/01/10 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
javascript如何创建对象
2016/08/29 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
Numpy数组转置的两种实现方法
2018/04/17 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
电脑售后服务承诺书
2014/03/27 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
技术合作协议书范本
2014/04/18 职场文书
对教师的评语
2014/04/28 职场文书
2014年党支部承诺书
2014/05/30 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
学校体育节班级口号
2015/12/25 职场文书
MySQL查询日期时间
2022/05/15 MySQL
Apache自带的ab压力测试工具的实现
2022/07/23 Servers
基于Python实现西西成语接龙小助手
2022/08/05 Golang