<p>如果我正确地假设您只想在模板中生成结果dict:</p>
<p>我想知道这里最好的办法是使用过滤器吗?
这有点复杂,但一旦生成了dict,就可以使用过滤器提取每个级别。
挑战在于过滤器只能接受一个参数,因此您必须对“条目路径”和您以某种方式提取的内容以及链调用进行编码</p>
<p>我涂鸦的内容如下:</p>
<p>在代码的某个地方注册过滤器:</p>
<pre><code>from typing import List, Dict, Any
from django import template
register = template.Library()
...
@register.filter
def extract_and_group(entries: List[Dict[str, Any]], attribute: str) -> Dict[str, List[Dict[str, Any]]:
grouped = {}
for entry in entries:
key = entry[attribute]
without_key = entry.copy()
del without_key[key]
grouped[key] = grouped.get(key, []) + [without_key]
return grouped
@register.filter
def further_extract(extracted: Dict[str, Any], path: str) -> Dict[str, Any]:
paths = path.split(".")
assert "->" in paths[-1]
last, key = paths[-1].split("->")
paths[-1] = last
dicts = [extracted]
for p in paths:
parent_dict = dicts[-1]
dicts.append(parent_dict[p])
to_alter = dicts[-2]
assert isinstance(to_alter, list)
extracted_entry = extract_and_group(to_alter, key)
dicts[-2][last] = extracted_entry
return extracted
</code></pre>
<p>您可以通过以下方式在模板中使用它:</p>
<pre><code>plans|extract_and_group:"code"|further_extract:"name"|further_extract:"name->plan_type"|further_extract:"name.plan_type->hour"
</code></pre>
<p>为了可读性,我在这里使用了类型提示,但是如果您不在Python3.8+上,可以删除。
无论如何,我还没有测试过这个,它有点难看,但我想这是一个选择?🤔 </p>
<p>当然,您不必在模板中执行此操作,因此如果我的假设不正确,您可以调整上述代码,使其不在过滤器中</p>
<p>希望这是一个起点</p>