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输出一个杨辉三角的例子
Jun 13 Python
python求pi的方法
Oct 08 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
一篇文章搞懂Python的类与对象名称空间
Dec 10 Python
python修改字典键(key)的方法
Aug 05 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
python3 下载网络图片代码实例
Aug 27 Python
python tkinter基本属性详解
Sep 16 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 Python
python 负数取模运算实例
Jun 03 Python
在Mac中配置Python虚拟环境过程解析
Jun 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
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
PHP制作万年历
2015/01/07 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
php实现URL加密解密的方法
2016/11/17 PHP
php和asp语法上的区别总结
2019/05/12 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
javascript正则表达式中的replace方法详解
2015/04/20 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python中Random和Math模块学习笔记
2015/05/18 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
在python里面运用多继承方法详解
2019/07/01 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
对python中return与yield的区别详解
2020/03/12 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
人力资源求职信
2014/05/25 职场文书
学校标语大全
2014/06/19 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
运动会加油稿30字
2015/07/21 职场文书