У меня есть база данных SQLite, которую я запрашиваю следующим образом:
products = cursor.execute(
Select Item,EntryDate,json_group_array(json_object('color',P.option)) as colorarray
.....
).fetchall()
Результаты продуктов могут выглядеть так
[('dress', '2022-12-27 00:00:00', '[{"color":"blue"},{"color":"green"}]')]
В моем шаблоне jinja я пытаюсь перебрать JSON, но мои данные обрабатываются как строка и распечатываются по одному символу за раз.
{% for color in products[2] %}
{{ color }}
{% endfor %}
Каков правильный способ сделать это? Я могу изменить свой запрос SQLite, чтобы он не использовал json_group_array, если есть более идиоматический вариант. Также я бы предпочел ссылаться на свои данные по именам столбцов (например, products.colorarray), если это возможно.
Я пробовал этот запрос с SQLite, а также пытался издеваться над данными.
Как сказано в комментариях, products[0][2]
— это строка, на самом деле SQLite json_object() возвращает сериализованный JSON, а поскольку строки являются итерируемыми, вы заметили это:
В моем шаблоне jinja я пытаюсь перебрать JSON, но мои данные обрабатываются как строка и распечатываются по одному символу за раз.
десериализовать products[0][2]
с помощью json.loads() .
Также я бы предпочел ссылаться на свои данные по именам столбцов (например, products.colorarray), если это возможно.
Jinja может читать словарь следующим образом:
d = {
"item": products[0][0],
"timestamp": products[0][1],
"colorarray": json.loads(products[0][2])
}
затем получите доступ по клавише colorarray
:
{% for color in d["colorarray"] %}
{{ color["color"] }}
{% endfor %}
(1) Первый пример кода не является допустимым кодом Python. (2) Для Sqlite и Python JSON — это просто строка. Используйте модуль «json», чтобы преобразовать его в объекты Python.