如何在Django模板中获取外键反向引用,统计每篇博客的评论数量
两种实现方式都可以,具体用法如下:
方案1:直接在模板实现(适合数据量极小的场景)
你已经给Comment的外键字段设置了related_name='comment',直接在模板的对应位置填写{{ b.comment.count }}即可输出当前文章的评论总数。
该方法无需修改后端代码,但存在N+1查询性能问题:如果页面展示100篇博客,会先发起1次全量博客查询,再循环发起100次单篇博客的评论计数查询,总共有101次数据库请求,数据量大时性能损耗非常明显。
方案2:修改views.py提前聚合(推荐,性能更优)
使用Django内置的聚合注解能力,在查询博客列表时就把对应评论数提前计算好,全程仅需1次数据库查询,性能远高于方案1。
首先修正你现有views.py里的笔误:你定义的博客列表变量是all_blogs,但传入context时写了未定义的blog,会直接报错。
修改后的完整views.py代码如下:
# 头部先导入Count聚合工具 from django.db.models import Count def main_page(request): # annotate会给每个Blog对象新增comment_count属性,存储对应评论总数 all_blogs = Blog.objects.annotate(comment_count=Count('comment')) context = { 'blog' : all_blogs, } return render(request, 'main/home.html', context)
之后在模板的对应位置填写{{ b.comment_count }}即可拿到评论数。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

