我正在阅读《Django 2 by Example》一书,有一次我感到很困惑,其中有一行 {% with comments.count as total_comments %}
作者继续解释
We are using the Django ORM in the template, executing the QuerySet
comments.count()
...The {% with %} template tag is useful to avoid hitting the database or accessing expensive methods multiple times.
我认为模板正在使用传递给它们的任何上下文并且不会发生数据库访问?
最佳答案
I thought templates are using whatever context is passed to them and no database access occurs?
它使用通过上下文传递的内容。但是 QuerySet
是延迟执行的。这意味着,如果您传递 MyModel.objects.all()
,它将不会进行查询,或者至少不会立即进行查询。
只有当您“使用”查询集(例如通过迭代查询集或计算查询集的长度)时,您才会对数据库进行查询。因此,一个模板可以触发多个数据库查询。事实上,N+1 问题通常是由迭代一个 QuerySet
对象,然后查询相关管理器的模板引起的。
QuerySet
上的 .count()
也会立即求值,因此,如果您有 somequeryset
,并且您调用 .count()
将触发数据库查询。如果这是在循环中或在模板中的不同位置完成的,那么它将减少对数据库的更多查询。通过使用 {% with …=… %}
语句,您将在模板计算 {% with …=… %}
部分时进行查询,然后您可以多次重复使用该变量。
关于python - 使用Django模板标签执行查询集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59250832/