使用Jinja按嵌套字典值筛选

2024-06-01 14:35:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我的盐堆柱子上有以下山药:

prometheus:
  services:
    cassandra:
      enabled: False
    cockroachdb:
      enabled: True
    haproxy:
      enabled: True
    swift:
      enabled: False

我希望能够循环使用启用的服务列表。在

^{pr2}$

但是,这不起作用,因为我尝试筛选的属性位于服务名称下面的嵌套词典中:

{'cassandra': {'enabled': False},
 'cockroachdb': {'enabled': True},
 'haproxy': {'enabled': True},
 'swift': {'enabled': False}}

通过在循环中应用条件测试,我显然可以实现我想要的:

{% for name, properties in prometheus.services | dictsort %}
{% if properties.enabled %}
configuration for {{ name }}
{% endif %}
{% endfor %}

但是,我会经常循环这个列表,并希望Jinja在for循环中在线应用过滤器。在

有没有一种方法可以根据嵌套字典中某项的值进行筛选?在


Tags: namefalsetrue列表forserviceenabledproperties
2条回答

嗯,我认为在这种情况下,yaml文件的结构越好,解决问题的选项就越多。在

我建议进行以下重组:

prometheus:
  services:
    - name: cassandra
      enabled: False
    - name: cockroachdb
      enabled: True
    - name: haproxy
      enabled: True
    - name: swift
      enabled: False

然后你可以用不同的方法迭代,这可能是一种方法:
{{ prometheus.services | selectattr('enabled', True) | map(attribute='name') | list }}

我希望这有帮助!在

无需更改支柱的结构,您可以通过groupby将列表分成两组。在

{% for group in prometheus.services.items() | groupby ('1.enabled') %}
{% if group.grouper = True %}
{% set enabled_services = group.list %}
{% else %}
{% set disabled_services = group.list %}
{% endif %}
{% endfor %}

它看起来有点复杂,但是如果您需要遍历这两个列表,它会很有用。在

相关问题 更多 >