python - 使用Django模板标签执行查询集吗?

标签 python django django-models django-templates django-queryset

我正在阅读《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/

相关文章:

python - 从 matplotlib 中显示的图中获取数据并将其传递给概率密度函数

python - 尝试使用 gmpy 在 Python 中计算大数。 Python 一直崩溃?

python - Django 忘记密码功能更改默认电子邮件

django - "QuerySet' 对象没有属性 'user'

python - Django:过滤包含存储正则表达式的字段的模型

python - 如何配置pycharm使用nose2代替nose

python - 如何使用 pytest 为类范围固定装置创建一个工厂?

python - 将激活数据从电子邮件发送回 Django 服务器的代码

Django 文件上传

django - 如何执行计数并加入django?