Из этого json:
{
"obj": [
{
"int": 0
},
{
"int": 1
}
]
}
Я хотел бы получить список свойств int
поля obj
, чтобы я мог выполнить агрегацию в списке, например. взяв среднее значение int
в obj
, используя синтаксис Jinja2.
Я пытался использовать фильтр selectattr("int")
в сочетании с фильтром sum
, но получаю `неподдерживаемые типы операндов для +: 'int' и 'dict'.
Я использую Jinja2 с docxtpl
для создания файла docx из шаблона.
import json
j = '{"obj": [{"int": 0},{"int": 1}]}'
context = json.loads(j)
from docxtpl import DocxTemplate
import jinja2
tpl = DocXtemplate('template.docx')
tpl.render(context, jinja_env)
tpl.save('out.docx')
Шаблон docx содержит одну строку:
{{obj|selectattr("int")|sum}}
Я хотел бы видеть 1
в файле doxc при получении суммы, как я пытался сделать чуть выше, я также хотел бы иметь возможность делать среднее значение и в конечном итоге повторно использовать его в других операциях.
EDIT: В качестве ответа тем, кто говорит, что я должен сделать это внутри python:
Я разрабатываю инструмент для создания отчетов docx из базы данных и файла шаблона. Первая часть инструмента — это программа на C++, которая генерирует данные json из базы данных. Вторая часть — это скрипт для генерации отчета в формате docx из шаблона с использованием Jinja2. Я бы предпочел, чтобы пользователь возился только с шаблоном и не модифицировал скрипт, также я хотел бы иметь некоторую модульность и иметь возможность вычислять агрегации по дереву json. Поскольку Jinja2 предоставляет sum
для списка и другие виды операций, я подумал, что это может добавить еще один уровень модульности без необходимости писать дополнительный код. На данный момент я уже добавил для пользователя возможность выполнять агрегирование в дереве json и вставлять его в дерево узлов, но мое решение не идеально, и оно достигается за счет предоставления другого файла шаблона для генерации данных, что делает инструмент более сложный.
Надеюсь, теперь понятно, почему я не хочу делать это в сценарии.
Edit2: немного более сложный пример:
{
"arr": [
{
"obj": [
{
"name": 0
},
{
"name": 1
}
]
},
{
"obj": [
{
"name": 0
},
{
"name": 1
}
]
}
]
}
Я хотел бы иметь возможность сделать что-то вроде:
{{arr|get_attr_list('obj')|get_attr_list('int')}}
Еще лучшим решением было бы расширение списка в Jinja2 напрямую:
{{ [ y[int] for y in x[obj] for x in arr ] | sum }}