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?

Foi útil?

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().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top