首页
关于
友链
Search
1
ESXI 一些功能调整
443 阅读
2
SoftEther 客户端篇
423 阅读
3
天翼云网关3.0/4.0超管密码
414 阅读
4
SoftEther 服务端篇
308 阅读
5
远程桌面rustdesk使用说明
255 阅读
默认分类
代码相关
vue
html
python
系统
数据库
docker
安卓
软件分享
杂七杂八的工具
游戏分享
游戏相关
我的家庭影院
Ai
登录
Search
标签搜索
python
esxi
git
SoftEther
linux
apscheduler
在线
rclone
Ubuntu
list
列表
idm
激活码
Charles
pdf
免安装
鲁大师
图片查看器
蜂蜜浏览器
honeyview
哥特式
累计撰写
98
篇文章
累计收到
16
条评论
首页
栏目
默认分类
代码相关
vue
html
python
系统
数据库
docker
安卓
软件分享
杂七杂八的工具
游戏分享
游戏相关
我的家庭影院
Ai
页面
关于
友链
搜索到
1
篇与
的结果
2022-07-25
Django中的ORM操作之高级查询aggregate和annotate方法
[Django]中的ORM操作之高级查询aggregate和annotate方法aggregate()方法详解annotate()方法详解aggregate和annotate应用场景Django中使用原生SQLaggregate()方法详解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]))
2022年07月25日
52 阅读
0 评论
0 点赞