Modificar Frasco-SQLAlchemy resultado da consulta
-
21-12-2019 - |
Pergunta
Eu quero modificar os resultados a partir de um balão-o sqlalchemy consulta antes de enviá-los para render_template()
.
A vista de consultas e modifica os itens:
items = Items.query
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
Quando o modelo de saídas com os itens:
{% for i in items %}{{i.date_modified}}{% endfor %}
Esse erro é mostrado no depurador:
KeyError: 'date_modified'
No entanto, se eu modificar a consulta inicial para obter uma paginação objeto, o erro não é aumentado e a data de modificação aparece.
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)
Qual é a diferença entre o resultado da Consulta e a Paginação de resultados que permite o último a ser manipulado no local, mas não o primeiro?Como posso modificar os resultados, sem modificar a consulta com paginar?
Solução
Em ambos os exemplos você passar items
para o modelo.No entanto, o items
valor é diferente em cada caso.
No primeiro exemplo, items
é o objeto de Consulta da Items.query
.Este valor pode ser iterados, que é por isso que o loop for works.Mas os itens que precisam ser armazenados em algum lugar permanente.No modelo, a consulta é iterados de novo, e novos Itens instâncias são retornados que não foram modificadas em vista.
No segundo exemplo, items
é o resultado de paginate
, uma lista de Items
.Quando você modifica a cada item, é ainda armazenado na lista, e iterando-lo novamente no modelo de resultados no mesmo itens.
Para resolver o erro do primeiro exemplo, que você precisa para armazenar as referências aos itens que estão sendo devolvidos.A maneira mais fácil para fazer isso é para forçar a consulta para retornar uma lista: items = Items.query.all()
.