QuickBase Pipeline中Jinja表达式IN对负数列表不生效问题
问题解决:Jinja中IN表达式匹配负数失败
问题场景
我们需要根据用户选择的通知触发时机(到期前1天、到期日、到期后1天、到期后1周)触发通知,这些选项对应转换为FollowUp Days字段的1、0、-1、-7;同时有计算字段FollowUp Diff表示到期日与当前日的天数差。需求是将两个字段转为字符串后用Jinja的IN表达式匹配,但发现负数(如-1)匹配失败,正数场景正常。尝试过添加| string过滤器、给负数加括号、使用{{'-1'}}等方法均无效,相关代码如下:
{# Nbr of days from Due Date #} {% if a.follow_up_diff in a.follow_up_days | list %} True {% endif %} {# Nbr of days from Due Date #} {% if a.follow_up_diff | string in a.follow_up_days | string | list %} True {% endif %}
问题原因
第二种写法的错误在于:a.follow_up_days | string | list是把整个follow_up_days集合转为一个字符串(比如集合[-1, -7]会变成"[-1, -7]"),再拆分成字符列表,得到的是['[', '-', '1', ',', ' ', '-', '7', ']'],自然无法匹配"-1"这种完整的字符串。而第一种写法如果follow_up_diff是字符串类型、follow_up_days是数值类型,也会因类型不匹配导致负数无法匹配。
解决方案
方案1:字符串类型统一匹配
将follow_up_days中的每个元素单独转为字符串,再组成列表,然后和转为字符串的follow_up_diff匹配:
{# 将follow_up_days的每个元素转为字符串后组成列表 #} {% set follow_up_days_str = a.follow_up_days | map('string') | list %} {% if a.follow_up_diff | string in follow_up_days_str %} True {% endif %}
方案2:数值类型统一匹配
如果两个字段原本都是数值类型(或可转为数值),直接统一转为整数后匹配,避免字符串转换的问题:
{# 将两个字段都转为整数后匹配 #} {% set follow_up_days_int = a.follow_up_days | map('int') | list %} {% if a.follow_up_diff | int in follow_up_days_int %} True {% endif %}
这两种方案都能解决负数无法匹配的问题,优先推荐方案2,因为数值匹配更直接,避免字符串转换可能带来的额外问题。
内容的提问来源于stack exchange,提问作者Gabe Fig
相关产品推荐
相关产品推荐

