修改Flask-SQLAlchemy查询结果

时间:2014-07-29 22:34:50

标签: python flask sqlalchemy flask-sqlalchemy

我希望在将它们发送到render_template()之前修改flask-sqlalchemy查询的结果。

视图查询并修改项目:

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修改查询的情况下修改结果?

1 个答案:

答案 0 :(得分:1)

在这两个示例中,您都将items传递给模板。但是,items值在每种情况下都不同。

在第一个示例中,items是来自Items.query的查询对象。这个值可以迭代,这就是for循环工作的原因。但这些物品需要存放在永久性的地方。在模板中,将再次迭代查询,并返回未在视图中修改的新Items实例。

在第二个示例中,itemspaginate的结果,Items的列表。当您修改每个项目时,它仍然存储在列表中,并在模板中再次迭代它会产生相同的项目。

要解决第一个示例中的错误,您需要存储对要返回的项的引用。最简单的方法是强制查询返回一个列表:items = Items.query.all()