使用分页时如何更新值?

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:

【讨论】:

以上是关于使用分页时如何更新值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用猫鼬和EJS实现分页并在分页时保留搜索查询?

使用 CodeIgniter 分页时丢失 URI 段

使用wenzhixin引导表服务器端分页时如何向td元素添加类或属性

使用jspdf和html2canvas导出pdf文件分页时如何正常留白?

使用分页时 BigQuery 找不到工作

postgresql排序分页时数据重复问题