使用分页时如何更新值?
Posted
技术标签:
【中文标题】使用分页时如何更新值?【英文标题】:How to update values when using Pagination? 【发布时间】:2019-12-05 23:54:15 【问题描述】:如何在每次使用Pagination
对象检索帖子时增加views
的值?例如,下面的代码导致TypeError: 'Pagination' object is not iterable
:
@app.route('/myview/<int:page>')
def view(page=1):
per_page = 10
posts = Posts.query.order_by(Posts.time.desc()).paginate(page, per_page, error_out=False)
for post in posts:
post.views += 1
db.session.commit()
return render_template('view.html',posts=posts)
【问题讨论】:
@Gerg 你能在没有分页的情况下检查(使用 .all())你得到什么结果 @MohammadAarif 它适用于.all()
@Greg,在您的情况下,views
是什么,Post
模型中的一个功能?或者您是否尝试更新分页本身的结果?
@calestini views 是Post
表中的整数列。不尝试更新分页对象的结果,只尝试记录该对象/行已从数据库中检索/读取。
【参考方案1】:
据我了解,发生了两件事:
-
对象帖子的分页
在检索到的每一行上保存新信息
第 1 部分:分页是 paginate
返回的一个类,遍历元素的方法是通过 items
。这就是为什么您在尝试遍历 Pagination
类时得到 TypeError
的原因。您可以在docs 或this answer 上查看更多信息
正确的迭代方式是:
for post in posts.items:
# your code
第 2 部分:如果您想在迭代对象时更新它,您还需要添加它并提交。我不确定该对象是否可以在您循环时实际更新,但您可以尝试:
session = db.session
for post in posts.items:
post.views += 1
session.add(post)
session.commit()
return render_template('view.html',posts=posts)
如果它不起作用,您可以将 id 附加到列表并在最后更新全部,或者在循环内查询和更新,使用不同的会话。
posts_rendered = []
for post in posts.items:
posts_rendered.append(post.id)
session.query(Posts).filter(Posts.id.in_(posts_rendered))\
.update(Posts.views: Posts.views + 1)
session.commit()
可以在here找到关于更新的精彩回复
【讨论】:
【参考方案2】:你不能迭代directly分页对象-
你必须迭代项目 -
for post in posts.itmes:
【讨论】:
以上是关于使用分页时如何更新值?的主要内容,如果未能解决你的问题,请参考以下文章
使用wenzhixin引导表服务器端分页时如何向td元素添加类或属性