在模板中使用Django查询集会查询数据库吗?
模板中的值标签在调用非上下文值时,会强制 Django 访问数据库吗?
举个例子:
{{ request.user.username }}
是用来显示当前登录用户的用户名。但是像 {{ request.user.someobject_set.all }}
这样的调用,会把一个外键关联的查询集直接放到模板里。
用户的 someobject
集合是默认放进上下文的吗?还是说我需要在视图的 def get_context_data
方法里手动添加一个查询集?另外,任何其他通过关联找到的非请求对象也是这样吗?
下面的文档展示了在原始 Python 中查询集何时被评估,但并没有真正提到模板和视图之间的关系。
https://docs.djangoproject.com/en/1.6/ref/models/querysets/#when-querysets-are-evaluated
1 个回答
9
在模板中评估东西和在其他地方评估是完全一样的。当模板被渲染时,变量会被解析。如果所指的对象需要查数据库,那么这个对象就会去查。这里并不是模板在做什么聪明的事情,它只是告诉 request.user
去获取它的 someobject_set
属性,然后对这个属性调用 all
,这和在Python代码中发生的事情是完全一样的。