IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django中的ORM操作之高级查询aggregate和annotate方法 -> 正文阅读

[Python知识库]Django中的ORM操作之高级查询aggregate和annotate方法

今天毕设导师让我们拿着电脑去他办公室查看软件运行情况,然后让我加一些功能点和创新点,对博客内容进行数据挖掘,我想了想需要用到Django中的ORM操作之高级查询aggregate和annotate方法,那我们一起来学习一下吧。

aggregate()方法详解

aggregate的中文意思是聚合,源于SQL的聚合函数,Django的aggregate()方法作用是对一组值 (比如queryset的某个字段)进行统计计算,并以字典(Dict)格式返回统计计算结果。

django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM等。

annotate()方法详解

annotate的中文意思是注释,一个更好的理解是分组(Group By)。如果你想要对数据集先进行分组然后再进行某些聚合操作或排序时,需要使用annotate方法来实现。

与aggregate方法不同的是, annotate方法返回结果的不仅仅是含有统计结果的一个字典,而是包含有新增统计字段的查询集(queryset) 。

values或者values_list 放在annotate前面: 表示values或values_list是声明以什么字段分组,annotate执行分组。

values或者values_list放在annotate后面: annotate表示直接以当前表的pk执行分组, values或者values_list表示查询那些字段, 并且要将annotate里的聚合函数起别名, 在values或者values_list里面写其别名。

res = Publish.objects.values("name").annotate(in_price = Min("book__price"))

# 先以出版社的名字进行分组, 然后再使用聚合函数查询到每个出版社里面最便宜的书籍

aggregate和annotate应用场景

Django的aggregate和annotate方法属于高级查询方法,主要用于组合查询,可以大大提升数据库查询效率。

当你需要对查询集(queryset)的某些字段进行聚合操作时(比如Sum, Avg, Max),请使用aggregate方法。

如果你想要对数据集先进行分组(Group By)然后再进行某些聚合操作或排序时,请使用annotate方法。

Django中使用原生SQL

我一开始想图简化,就不想用sql,于是转战django中的orm,结果今天卡住了,想半天想不出来怎么转,又回到了sql,所以说啊,不要偷懒,不然会很痛苦的,血的教训!

那么问题来啦,Django中怎么使用原生Sql呢?

首先我现在的需求是,查询每一个类别的文章的总数目、总访问量、总评论量以及每一个作者的文章的总数目、总访问量、总评论量,对应的sql语句如下:

select category_id,count(id),sum(total_views),sum(comments) from tb_article group by category_id;
select author_id,count(id),sum(total_views),sum(comments) from tb_article group by author_id;

在这里插入图片描述
在这里插入图片描述
在Django中执行原生sql的操作如下:

# 查询各个类别、各个作者的文章的总数量、总访问量、总评论量
        try:
            # 创建连接
            conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='wxm20010428', db='blog', charset='utf8')
            # 创建游标
            cursor = conn.cursor()
            # 原生sql语句  注意多条sql语句执行时的写法
            sql1 = 'select category_id,count(id),sum(total_views),sum(comments) from tb_article group by category_id;'
            sql2 = 'select author_id,count(id),sum(total_views),sum(comments) from tb_article group by author_id;'
            # 执行SQL
            cursor.execute(sql1)
            result1 = cursor.fetchall()
            for r1 in result1:
                print(r1)
            # 完成sql1的查询
            cursor.execute(sql2)
            result2 = cursor.fetchall()
            for r2 in result2:
                print(r2)
            # 完成sql2的查询
            cursor.close()
            conn.close()
        except Exception as e:
            print("Error%d: %s" % (e.args[0], e.args[1]))

执行结果如下:
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:49:32  更:2022-04-23 10:49:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:00:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码