使用Django模板标签是否会执行QuerySet?相关技术疑问咨询
关于Django模板中调用ORM方法触发数据库查询的解惑
嘿,这个问题问得太到位了——不少刚上手Django的朋友都会有“模板只能用上下文里的东西,绝对不会碰数据库”的误解,咱来一步步理清楚:
首先要打破这个认知:Django模板允许调用上下文对象的方法,而这些方法完全可能触发数据库查询。你看到的comments.count()就是典型例子:
- 这里的
comments应该是一个关联的QuerySet(比如某篇博客Post对象的外键关联评论集合),它本身是Django ORM的惰性查询集——也就是说,在你调用.count()之前,它并没有真正执行SQL去数据库捞数据; - 当模板解析到
comments.count()时,就会触发这个方法,此时Django才会向数据库发送一条SELECT COUNT(*)的SQL语句,拿到评论总数。
然后再说说{% with comments.count as total_comments %}的作用:
- 如果不用这个标签,你在模板里每写一次
comments.count(),就会触发一次数据库查询——比如你在页面上既要显示“共X条评论”,又要在循环里判断“如果有评论才显示列表”,两次调用count()就会查两次数据库,完全没必要; - 用
{% with %}标签把comments.count()的结果缓存到total_comments变量里之后,后续所有用到这个值的地方都会直接用缓存的结果,不会再去碰数据库,这就是作者说的“避免多次访问数据库或调用开销较大的方法”的原因。
最后补充个小提醒:虽然模板里能调用这些方法,但Django的最佳实践还是尽量把复杂的业务逻辑放在视图、模型方法或者自定义模板标签里,像.count()这种简单的查询在模板里使用是很常见的,搭配{% with %}做优化就更稳妥了。
内容的提问来源于stack exchange,提问作者West
相关产品推荐
相关产品推荐

