前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django进阶-9-ORM分组与聚合查询

Django进阶-9-ORM分组与聚合查询

作者头像
小团子
发布2019-07-18 16:02:53
9490
发布2019-07-18 16:02:53
举报
文章被收录于专栏:数据云团数据云团

一 、ORM 查询性能

① 普通查询

代码语言:javascript
复制
#for循环10次发送10次数据库查询请求
obj_list=models.Articles.objects.all() 
    for row in obj_list:
        print(row.name)

这种查询方式第一次发送 查询请求每for循环一次也会发送查询请求

② select_related()

结果为对象 注意query_set类型的对象 都有该方法。

查询时主动完成连表形成一张大表,for循环时不用额外发请求;

试用场景: 节省硬盘空间,数据量少时候适用相当于做了一次数据库查询;

代码语言:javascript
复制
obj_list=models.Articles.objects.all().select_related('category')
    for row in obj_list:
        print(row.category.name)

③ prefetch_related()

做连表操作依然会影响查询性能,所以出现prefetch_related;

prefetch_related:不做连表,多次单表查询外键表 ,去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询)

适用场景:效率高,数据量大的时候适用。

代码语言:javascript
复制
obj_list=models.Articles.objects.all().prefetch_related('category')
    for obj in obj_list:
        print(obj.category.name)

二、ORM 分组和聚合查询

① aggregate(*args,**kwargs) 聚合函数

通过对 QuerySet 进行计算,返回一个聚合值的字典。aggregate() 中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

代码语言:javascript
复制
from django.db.models import Avg,Sum,Max,Min
#求书籍的平均价
ret=models.Book.objects.all().aggregate(Avg('price'))
#{'price__avg': 145.23076923076923}

② annotate(*args,**kwargs) 分组函数

代码语言:javascript
复制
#查看每一位作者出过的书中最贵的一本(按作者名分组 values() 然后annotate 分别取每人出过的书价格最高的)
ret=models.Book.objects.values('author__name').annotate(Max('price'))
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档