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 dict remove数组删除(del,pop)
Mar 24 Python
pyqt4教程之widget使用示例分享
Mar 07 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
django框架模板语言使用方法详解
Jul 18 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
详解python爬取弹幕与数据分析
Nov 14 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 Python
python 破解加密zip文件的密码
Apr 22 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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笔记 字符串处理
2010/10/19 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
YII框架常用技巧总结
2019/04/27 PHP
validator验证控件使用代码
2010/11/23 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python装饰器初探(推荐)
2016/07/21 Python
Python如何快速实现分布式任务
2017/07/06 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
python程序文件扩展名知识点详解
2020/02/27 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
Python如何实现单例模式
2016/06/03 面试题
单位办理社保介绍信
2014/01/10 职场文书
团拜会策划方案
2014/06/07 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
西岭雪山导游词
2015/02/06 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js