修改Flask-SQLAlchemy查询结果
我想在把从flask-sqlalchemy查询得到的结果发送到render_template()
之前,先对这些结果进行一些修改。
这个视图会查询并修改一些项目:
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)
查询结果和分页结果之间有什么区别,让后者可以直接修改而前者不行?我该怎么在不使用分页的情况下修改结果呢?
1 个回答
1
在这两个例子中,你都把 items
传给了模板。不过,这里的 items
值在每个例子里是不同的。
在第一个例子中,items
是来自 Items.query
的查询对象。这个值可以被遍历,所以 for 循环可以正常工作。但是,这些项目需要存储在一个永久的地方。在模板中,这个查询又被遍历了一遍,返回了新的 Items 实例,而这些实例在视图中并没有被修改。
在第二个例子中,items
是 paginate
的结果,也就是一个 Items
的列表。当你修改每个项目时,它仍然保存在这个列表里,再次在模板中遍历时,得到的还是同样的项目。
要解决第一个例子中的错误,你需要存储返回的项目的引用。最简单的方法就是强制查询返回一个列表:items = Items.query.all()
。