You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jinja2模板中按自定义规则排序MongoDB返回的列表?

在Jinja2模板中按自定义顺序排序列表

问题描述

我从MongoDB数据库查询得到如下Python列表:

db.coll.find()
> ["Create", "Infra", "Consolidate"]

希望在Jinja2模板中按指定顺序对该列表排序,目标结果为:

["Infra", "Create", "Consolidate"]

尝试了以下写法但未生效:

{% for item in list|sort("Infra", "Create", "Consolidate") %}
    {{ item }}
{% endfor %}

解决方法

Jinja2的sort过滤器默认仅支持自然排序,无法直接传入自定义顺序参数。你可以通过以下两种方式实现需求:

方法一:在Jinja2模板内处理

先定义目标排序的基准列表,再利用元素在该列表中的索引作为排序键:

{# 定义期望的排序顺序 #}
{% set desired_order = ["Infra", "Create", "Consolidate"] %}

{# 按自定义顺序排序并遍历 #}
{% for item in list|sort(key=lambda x: desired_order.index(x) if x in desired_order else len(desired_order)) %}
    {{ item }}
{% endfor %}
  • 逻辑说明:通过lambda函数获取元素在desired_order中的索引值,以此作为排序依据;若元素不在目标列表中,将其索引设为目标列表长度,让这类元素排在最后。

方法二:在Python后端提前排序(推荐)

如果数据量较大,更高效的方式是在Python代码中提前完成排序,再将结果传递给模板:

# Python后端代码
desired_order = ["Infra", "Create", "Consolidate"]
# 从MongoDB获取数据
raw_list = db.coll.find()
# 按自定义顺序排序
sorted_list = sorted(raw_list, key=lambda x: desired_order.index(x))
# 将sorted_list传递给Jinja2模板

模板中直接遍历已排序的列表即可:

{% for item in sorted_list %}
    {{ item }}
{% endfor %}

原写法失效原因

Jinja2的sort过滤器语法为sort(reverse=false, case_sensitive=false, attribute=None, key=None),并不支持直接传入排序顺序字符串作为参数,因此你之前的写法无法生效。

内容的提问来源于stack exchange,提问作者Jeremy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:38:09