Изменить результат запроса Flask-SQLAlchemy
-
21-12-2019 - |
Вопрос
Я хочу изменить результаты запроса flask-sqlalchemy, прежде чем отправлять их в render_template()
.
Представление запрашивает и изменяет элементы:
items = Items.query
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
Когда шаблон выводит элементы:
{% for i in items %}{{i.date_modified}}{% endfor %}
Эта ошибка отображается в отладчике:
KeyError: 'date_modified'
Однако если я изменю исходный запрос, чтобы получить объект нумерации страниц, ошибка не возникнет и появится дата изменения.
items = Items.query
items = items.paginate(page_num, items_per_page, True).items
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
В чем разница между результатом запроса и результатом разбиения на страницы, которая позволяет манипулировать последним на месте, но не первым?Как я могу изменить результаты, не изменяя запрос с помощью paginate?
Решение
В обоих примерах вы передаете items
к шаблону.Однако items
стоимость в каждом случае разная.
В первом примере items
это объект запроса из Items.query
.Это значение можно перебирать, поэтому цикл for работает.Но предметы нужно хранить где-то постоянно.В шаблоне запрос повторяется снова, и возвращаются новые экземпляры Items, которые не были изменены в представлении.
Во втором примере items
является результатом paginate
, список Items
.Когда вы изменяете каждый элемент, он по-прежнему сохраняется в списке, и повторная итерация по нему в шаблоне приводит к получению тех же элементов.
Чтобы устранить ошибку из первого примера, вам необходимо сохранить ссылки на возвращаемые элементы.Самый простой способ сделать это — заставить запрос возвращать список: items = Items.query.all()
.