模板里随手写一个 a.books|length,背后可能是一次数据库查询。Query、生成器、缺失的变量在模板里分别会怎样?这篇用 SQL 计数和对照实验把它们一一暴露出来。
循环里访问 a.books|length(懒加载) 查询阶段 1 条 + 渲染阶段 20 条 = 共 21 条 SELECT 语句示例: ['SELECT author.id, author.name ', 'SELECT book.id, book.title, book.author_id ', 'SELECT book.id, book.title, book.author_id '] 视图里 selectinload 预加载 查询阶段 2 条 + 渲染阶段 0 条 = 共 2 条 SELECT 视图里 joinedload 预加载 查询阶段 1 条 + 渲染阶段 0 条 = 共 1 条 SELECT
模板里循环两遍 Query 查询阶段 0 条 + 渲染阶段 2 条 = 共 2 条 SELECT 先 .all() 再循环两遍 查询阶段 1 条 + 渲染阶段 0 条 = 共 1 条 SELECT 模板里调 q.count() 再循环一遍 查询阶段 0 条 + 渲染阶段 2 条 = 共 2 条 SELECT
循环两遍同一个生成器: '012|' 先 |list: '012|012'
{{ missing }} →
{{ missing.attr }} → UndefinedError: 'missing' is undefined
{{ missing|default("默认") }} → 默认
{{ d.k }} →
{{ d["k"] }} →
{{ d.k.z }} → UndefinedError: 'dict object' has no attribute 'k'
{% if missing %}真{% else %}假{% endif %} → 假
{% if d.k.z is defined %}已定义{% else %}未定义{% endif %} → UndefinedError: 'dict object' has no attribute 'k'
{{ o.good }}|{{ o.nope }}|[{{ o.bad }}] → ok||[]
{{ o.method }} → <bound method Obj.method of <__main__.Obj object at 0x109d2ce10>>
{{ o.method() }} → m
{{ missing + 1 }} → UndefinedError: 'missing' is undefined
{{ missing|length }} → 0
{% for x in missing %}x{% endfor %}完 → 完 Undefined ['', '假', '默认']
StrictUndefined ['UndefinedError', 'UndefinedError', '默认']
DebugUndefined ['{{ missing }}', '假', '默认']