Django annotation,减少IO次数利器

栏目: Python · 发布时间: 5年前

内容简介:annotation的中文含义是"注解"。正如这名字所暗示的,传递给annotate函数的每个参数,都会以"注解"的形式添加到model queryset返回的每一个object里面。和annotate经常在一起使用的是aggregation函数。Blog Model有一个外键entry指向Entry model。我们想计算每个blog有多少个entry:

annotation的中文含义是"注解"。正如这名字所暗示的,传递给annotate函数的每个参数,都会以"注解"的形式添加到model queryset返回的每一个object里面。

和annotate经常在一起使用的是aggregation函数。

举个栗子

Blog Model有一个外键entry指向Entry model。我们想计算每个blog有多少个entry:

>>> from django.db.models import Count
>>> q = Blog.objects.annotate(Count('entry'))
# The name of the first blog
>>> q[0].name
'Blogasaurus'
# The number of entries on the first blog
>>> q[0].entry__count
42
复制代码

我们一起break down上面这部分代码:

q = Blog.objects.annotate(Count('entry'))
复制代码

这里使用了Count这个aggregation函数,作用是对一个指定的Blog object,计算它对应的Entry object有多少个。Blog.objects.annotate(Count('entry'))就是对每个Blog object,计算一下与之对应entry有几个。返回值是一个queryset。与

Blog.objects.all()
复制代码

的区别在于,Blog.objects.annotate(Count('entry'))中的每一项,都多了一个entry__count字段,这就是我们想要的那个数据。

q[0].name
q[0].entry__count
复制代码

q是一个queryset,q[0]就是获取第一个object,他里面多了一个entry__count字段。

举个反栗子

如果你不知道annotate这个东西,你肯定会想到一种"pythonic"的方法:

q = Blog.objects.all()
for blog in q:
    entry__count = blog.entry.count()
    print(blog.name)
    print(entry__count)
复制代码

这种方法更容易理解,但是会杀死你的性能。假如你有10W条blog,q = Blog.objects.all() 这里进行了一次查询,for循环那里,对每一个blog都要进行一次查询,所以总查询次数是10W+1次,也就是那么多次IO。而前面那种方法,总查询次数只有一次,IO只有一次,计算entry的个数是在数据库内容进行的,效率当然要高很多!

数据库查询有一个黄金原则: 尽可能减少IO次数 。而 Python 的for循环天然就会增加IO次数,所以,请拥抱annotation吧。

关注我的微信公众号

Django annotation,减少IO次数利器

以上所述就是小编给大家介绍的《Django annotation,减少IO次数利器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

互联网金融手册

互联网金融手册

谢平、邹传伟、刘海二 / 中国人民大学出版社 / 2014-4-1 / 68.00元

本书作者在2012年4月7日“金融四十人年会”上首次公开提出了“互联网金融”概念。在短短两年中,互联网金融已经成为中国金融界和IT界最热门的词汇之一,相关创业活动也非常活跃。本书是作者两年来深入研究、思考的结晶,畅想了金融与IT结合的未来图景,将理论与实践高度融合,与读者分享了许多深具洞察力的观点。本书力图规范互联网金融的定义,完善互联网金融的理论体系,分析互联网金融目前的六种主要类型——金融互联......一起来看看 《互联网金融手册》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具