【问题标题】:Is it possible to sort a list of objects in Jinja2 based on subattributes?是否可以根据子属性对 Jinja2 中的对象列表进行排序?
【发布时间】:2018-03-20 09:12:20
【问题描述】:

就我而言,我有一个字典列表,其中包含其他几个字典列表。

l = [{
'a': [
    { 'b': 4}
    ]
}, {
'a': [
    { 'b': 3}
    ]
}]

从技术上讲,我想做的是使用 jinja2 的排序过滤器使用路径 ['a'][0]['b'] 进行排序。

有没有可能?

【问题讨论】:

  • 可以用 Python 编写过滤器:jinja.pocoo.org/docs/dev/api/#custom-filters
  • 真的,你应该在任何 Python 代码呈现 Jinja 模板中执行此操作。
  • @DanielRoseman:从高层次的角度来看,这只是对现有记录的重新排序。我认为在模板中做 in 可能是可以接受的。

标签: python templates jinja2


【解决方案1】:

您可以在sort 中使用attribute 参数,其中您将0 指定为列表中的第一个元素,然后将b 作为该元素的键,在您的情况下您有attribute="a.0.b"

your_document_list  = [{
'a': [
    { 'b': 4}
    ]
}, {
'a': [
    { 'b': 3}
    ]
}]
{% for document in your_document_list | sort(attribute="a.0.b") %}
    ...
{% endfor %

【讨论】:

    【解决方案2】:

    您可以编写自定义模板过滤器。

    http://jinja.pocoo.org/docs/dev/api/#custom-filters

    这是一个粗略的解决方案(不支持反转、区分大小写等):

    应用中的某处:

    def deep_sort(value, attribute, subattribute):
      return sorted(value, key=lambda element: element[attribute][0][subattribute])
    
    environment.filters['deep_sort'] = deep_sort
    

    在你的模板中:

            {% for value in l|deep_sort('a', 'b') %}
                {{value['a'][0]['b']}}
            {% endfor %}
    

    【讨论】:

      【解决方案3】:

      如果需要,您可以在一行中尝试:

      l = [{
      'a': [
          { 'b': 4}
          ]
      }, {
      'a': [
          { 'b': 9}
          ]
      },
       {
      'a': [
          { 'b': 3}
          ]
      }]
      print(sorted(l,key=lambda x:x['a'][0]['b']))
      

      输出:

      [{'a': [{'b': 3}]}, {'a': [{'b': 4}]}, {'a': [{'b': 9}]}]
      

      解释:

      使用 lambda 你可以访问 b 的值,所以基本上 sorted() 将在这里根据 int 列表排序:

      print(list(map(lambda x:x['a'][0]['b'],l)))
      

      输出:

      [4, 9, 3]
      

      sorted() 将根据这个列表进行排序。

      【讨论】:

        猜你喜欢
        • 2019-06-30
        • 1970-01-01
        • 2021-06-27
        • 2022-01-11
        • 2022-01-05
        相关资源
        最近更新 更多