Modifier Flacon-SQLAlchemy résultat de la requête
-
21-12-2019 - |
Question
Je veux modifier les résultats à partir d'un flacon de sqlalchemy requête avant de l'envoyer à render_template()
.
Le point de vue des requêtes et modifie les articles:
items = Items.query
for i in items:
date = i.__dict__['date']
i.__dict__['date_modified'] = date.replace('/', '-')
return render_template('index.html', items=items)
Lorsque le modèle sorties les éléments:
{% for i in items %}{{i.date_modified}}{% endfor %}
Cette erreur est indiqué dans le débogueur:
KeyError: 'date_modified'
Cependant, si je modifie la requête initiale pour obtenir une pagination de l'objet, l'erreur ne se pose pas et la date de modification s'affiche.
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)
Quelle est la différence entre le résultat de la Requête et de la Pagination résultat qui permet à cette dernière d'être manipulé en place, mais pas l'ancien?Comment puis-je modifier les résultats sans avoir à modifier la requête avec la pagination?
La solution
Dans les deux exemples que vous passer items
pour le modèle.Cependant, l' items
la valeur est différente dans chaque cas.
Dans le premier exemple, items
est l'objet de Requête de Items.query
.Cette valeur peut être itéré, qui est pourquoi la boucle fonctionne.Mais les articles doivent être stocké dans un endroit permanent.Dans le modèle, la requête est itéré de nouveau, et de nouveaux Éléments instances sont retournées qui n'ont pas été modifiés dans la vue.
Dans le deuxième exemple, items
est le résultat de paginate
, une liste de Items
.Lorsque vous modifiez chaque élément, il est toujours stocké dans la liste, et de parcourir à nouveau dans le modèle de résultats dans les mêmes éléments.
Pour résoudre l'erreur dans le premier exemple, vous avez besoin de stocker les références pour les articles retournés.La façon la plus simple de le faire est à la force, la requête retourne une liste: items = Items.query.all()
.