Modifica Flask-SQLalchemy Query Risultato
-
21-12-2019 - |
Domanda
Voglio modificare i risultati da una query flak-sqlalchemy prima di inviarli a render_template()
.
La view Query e modifica gli elementi:
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 il modello emette gli elementi:
{% for i in items %}{{i.date_modified}}{% endfor %}
.
Questo errore è mostrato nel debugger:
KeyError: 'date_modified'
.
Tuttavia, se modifico la query iniziale per ottenere un oggetto di paginazione, l'errore non viene sollevato e viene visualizzata la data modificata.
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 è la differenza tra il risultato della query e il risultato del sagrazione che consente a quest'ultimo di manipolare in posizione ma non il primo?Come posso modificare i risultati senza modificare la query con Paginat?
Soluzione
In entrambi gli esempi si passano items
al modello.Tuttavia, il valore items
è diverso in ciascun caso.
Nel primo esempio, items
è l'oggetto query da Items.query
.Questo valore può essere sovrameso, motivo per cui il loop funziona.Ma gli articoli devono essere memorizzati da qualche parte permanenti.Nel modello, la query è intersetata di nuovo, e vengono restituite nuove istanze di elementi che non sono state modificate nella vista.
Nel secondo esempio, items
è il risultato di paginate
, un elenco di Items
.Quando si modifica ogni elemento, è ancora memorizzato nell'elenco e Itering su di esso di nuovo nei risultati del modello negli stessi elementi.
Per risolvere l'errore dal primo esempio, è necessario memorizzare i riferimenti agli elementi restituiti.Il modo più semplice per farlo è forzare la query per restituire un elenco: items = Items.query.all()
.