如何在Jinja2中按name属性过滤求和details.sections.details的value值?
Jinja2按name过滤sections并求和的正确实现
正确写法(推荐)
结合Jinja2过滤器链式调用,先筛选目标section,再对details的value字段求和:
{# 计算Earnings总和 #} {% set earnings_total = details.sections|selectattr('name', 'equalto', 'Earnings')|map(attribute='details')|first|sum(attribute='value') %} {# 计算Deductions总和 #} {% set deductions_total = details.sections|selectattr('name', 'equalto', 'Deductions')|map(attribute='details')|first|sum(attribute='value') %} {# 输出结果 #} Earnings: {{ earnings_total }} Deductions: {{ deductions_total }}
步骤说明:
selectattr('name', 'equalto', 'Earnings'):从sections数组中筛选出name为Earnings的section对象map(attribute='details'):提取该section下的details数组first:取出筛选后迭代器中的唯一元素(即目标details数组)sum(attribute='value'):对details数组内所有元素的value字段求和
你之前写法的错误原因
- 第一种写法未做过滤,直接调用
details.sections.details无效——sections是数组,不能直接通过.访问子元素的details,必须先筛选出目标section,因此脚本加载失败。 - 第二种写法错误在于Jinja2默认不支持直接重新赋值已声明的变量,
sumAdditions = sumAdditions + details.value这种语法不符合Jinja2规则,导致执行报错。
兼容旧版Jinja2的手动累加写法
如果你的Jinja2版本较低(不支持selectattr或变量重新赋值),可以用命名空间实现可变变量,循环累加:
{# 计算Earnings总和 #} {% set ns = namespace(earnings_total=0) %} {% for section in details.sections %} {% if section.name == 'Earnings' %} {% for item in section.details %} {% set ns.earnings_total = ns.earnings_total + item.value %} {% endfor %} {% endif %} {% endfor %} {# 计算Deductions总和 #} {% set ns_deduct = namespace(deductions_total=0) %} {% for section in details.sections %} {% if section.name == 'Deductions' %} {% for item in section.details %} {% set ns_deduct.deductions_total = ns_deduct.deductions_total + item.value %} {% endfor %} {% endif %} {% endfor %} {# 输出结果 #} Earnings: {{ ns.earnings_total }} Deductions: {{ ns_deduct.deductions_total }}
内容的提问来源于stack exchange,提问作者Bisoux
相关产品推荐
相关产品推荐

