如何通过 jinja2 中的查找字典过滤列表

How do I filter a list through a lookup dictionary in jinja2

如何过滤 jinja2 中的列表以通过查找生成值列表table?

我有一种情况是使用 Jinja2 生成 SQL。我有一个值列表,我想用基于查找的转换值列表替换它们:

start_values = ['a', 'c']
lookup_table = {
    'a': {
        'table_x': '11111',
        'table_y': '22222'
    },
    'b': {
        'table_x': '33333',
        'table_y': '44444'
    },
    'c': {
        'table_x': '55555',
        'table_y': '66666'
    }
}

在我的模板中,我希望能够使用过滤器而不是循环来执行类似这样的操作:

GROUP BY
{% for col in start_values %}
  {{ lookup_table[col]['table_x'] }},
{% endif %}

结尾的逗号将导致 SQL 格式不正确。

我想避免创建客户过滤器,但我还没有遇到可以按我需要的方式查找字典引用的过滤器:

{{ start_values|some_lookup_method(lookup_table)|map(attribute='table_x')|join(', ') }}

我无法将 map(attribute=*) 用于 some_lookup_method,因为我不知道如何访问来自 start_values 的密钥。大多数在线示例都是针对 Ansible 的,并使用扁平结构,如下所示。我不想要那个结构,所以请不要回答那个格式。

# Answers for this format are already plentiful on the Internet
lookup_table = [
    {
        'name': 'a',
        'table_x': '11111',
        'table_y': '22222'
    },
    # ...
]

遗憾的是,在本机 Jinja 中没有这样的过滤器来过滤字典或从字典中创建列表,就像您为 Ansible 找到的答案一样,它们使用 dict2items

这就是说,使用 loop.last,您可以有条件地添加或不添加逗号:

GROUP BY
{%- for col in start_values %}
  {{ lookup_table[col].table_x }}{% if not loop.last %},{% endif %}
{%- endfor %}

会给你

GROUP BY
  11111,
  55555