jinja2:拒绝字典中的特定属性

时间:2017-07-05 16:35:15

标签: python jinja2

我有以下字典:

public class MySingleton {  

private static MySingleton instance = new MySingleton();  

private MySingleton(){}  

public static MySingleton getInstance() {  
    return instance;  
}  }  

使用jinja2我想过滤掉(或拒绝)d = {'name': 'Johnny', 'age': 23, '_id': 167, 'sport': 'golf'} 键,所以我得到了以下字典(注意这个_id字段是动态的,所以我想拒绝密钥,无论它是什么&# 39; s等于):

_id

我已尝试使用内置过滤器{'name': 'Johnny', 'age': 23, 'sport': 'golf'} reject,但它没有按预期工作。这是我到目前为止所尝试的:

rejectattr

2 个答案:

答案 0 :(得分:1)

这是两种方法。第一种采用dasmy's元组拒绝列表方法,以使用dict global function而不是list filter。第二种方法呈现ast.native_eval会被NativeTemplate.render()称为字典的字符。 (第二种方法不仅已经很冗长,而且可能需要扩展以处理所有可能的类型。)

from jinja2.nativetypes import NativeTemplate


def render_d(template):
    print(
        NativeTemplate(template).render(
            d={"name": "Johnny", "age": 23, "_id": 167, "sport": "golf"}
        )
    )


render_d("{{dict(d.items() | rejectattr(0, 'equalto', '_id'))}}")

render_d(
    """
    {
        {% for key, value in d.items() -%}
            {% if key != "_id" -%}
                {% if value is string -%}
                    "{{key}}": "{{value}}",
                {% else -%}
                    "{{key}}": {{value}},
                {% endif -%}
            {% endif -%}
        {% endfor -%}
    }
    """.strip()
)

答案 1 :(得分:0)

也许稍晚一些,但是有些类似

{{ d.items() | rejectattr('0', 'equalto', '_id') | list }}

可能的帮助:它将dict转换为元组列表,并根据每个元组中第一个条目的值拒绝条目。根据您的用例,最终的|list可能不是必需的。它将再次将rejectattr创建的生成器对象转换为列表。