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 相关文章推荐
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
python实现知乎高颜值图片爬取
Aug 12 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 Python
python 遍历pd.Series的index和value
Nov 26 Python
Django ModelForm操作及验证方式
Mar 30 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
Keras设置以及获取权重的实现
Jun 19 Python
如何将json数据转换为python数据
Sep 04 Python
Python3中对json格式数据的分析处理
Jan 28 Python
python numpy中multiply与*及matul 的区别说明
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
php分页函数
2006/07/08 PHP
php Ajax乱码
2008/04/09 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
js+cookies实现悬浮购物车的方法
2015/05/25 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
react redux入门示例
2018/04/19 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python xml解析实例详解
2016/11/14 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
python读取指定字节长度的文本方法
2019/08/27 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
印尼太阳百货公司网站:Matahari
2018/02/04 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
建筑学推荐信
2013/11/03 职场文书
管理专员自荐信
2014/01/26 职场文书
社区工作者感言
2014/03/02 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
python实现A*寻路算法
2021/06/13 Python