【Python】annotate函数

在Django中碰到这个函数,按字面解释是注释函数,有的博客称之为汇总聚合函数。

那么此函数的作用到底是什么呢?

在我看来,此函数就是为数据库中查询出来<QuerySet>中的每个对象打上标签(或注释),只不过这个标签是个变量,里面可以存储我们想要的值。而且这个标签可以作为此对象的属性调用。

通过下面例子一看便知:

In [1]: from article.models import ArticlePost

In [2]: from django.db.models import Count

In [3]: articles = ArticlePost.objects.all()

In [4]: a = articles.annotate(total_comments=Count('comments'))

In [5]: a
Out[5]: <QuerySet [<ArticlePost: 哈哈哈>, <ArticlePost: 前世今生>, <ArticlePost: 爱莲说>, <ArticlePost: Learn Django>, <ArticlePost: 望江南·江南蝶>]>


In [6]: a[0].total_comments
Out[6]: 4

In [7]: a[1].total_comments
Out[7]: 0

首先,我们从数据库表ArticlePost中查询出所有的对象,赋值给articles

然后,利用annotate函数给articles中的每个对象打上标签,标签名叫total_comments,这个标签可以像变量一样存储值,而Count(‘comments’)用来查询与ArticlePost表相关联的Comment表中的评论数,因为ArticlePost表与Comment表以comments作为related_name相关联,所以可以通过comments对Comment表进行操作(这点不明白的同学可以查询related_name的用法)

再次,将统计出的评论数赋值给total_comments标签

这样,我们就给QuerySet中的每个对象添加了一个叫做total_comments的标签,此标签存储着统计出的评论数。

最后,我们就可以以调用属性的方式来使用这个标签,如a[0].total_comment

注意

1、这个标签并不是真的属性,也不会再数据库中保存,只是我们临时拿来用的。

2、annotate函数返回结果依然是QuerySet,所以支持链式编程。

看完有用请点赞~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值