flask sqlalchemy 多对多查询的结果如何进行分页?

发布于 2022-09-05 02:15:57 字数 1378 浏览 11 评论 0

学习flask中正在用flask做一个博客,(一篇文章可以有多个标签,一个标签可以对应多个文章,所以我这里按照网上的采用了many to many的关系),flask-sqlalchemy自带的paginate方法只能支持flask_sqlalchemy.BaseQuery的对象进行分页,但是我在多对对关系中用标签找出所有已关联该标签的文章对象是一个list,所以就不能分页。。。我现在想做分页是要怎么办?

我现在是要自己写一个分页吗?如果写大概是什么思路希望好心的大牛指点一下。
例子:
图片描述

#多对多关系中的两个表之间的一个关联表
tags = db.Table('post_tags',
    db.Column('post_id',db.Integer,db.ForeignKey('posts.id')),
    db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'))
)

# 发表文章模型
class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255))
    body = db.Column(db.Text())
    body_html = db.Column(db.Text())
    created = db.Column(db.DateTime)

    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    comments = db.relationship('Comment', backref='post',lazy='dynamic')  # 关联评论
    tags = db.relationship('Tag',secondary=tags,backref=db.backref('posts',lazy='dynamic'))#多对多关联

    def __repr__(self):
        return "<post_id={0}>".format(self.id)
        
#标签
class Tag(db.Model):
    __tablename__ = 'tag'
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(255))\


    def __repr__(self):
        return "{0}".format(self.title)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

離人涙 2022-09-12 02:15:57

你在Post模型中对tags的定义:

tags = db.relationship('Tag',secondary=tags,backref=db.backref('posts',lazy='dynamic'))#多对多关联

添加lazy='dynamic'参数后再试试:

tags = db.relationship('Tag',
                        secondary=tags,
                        backref=db.backref('posts',lazy='dynamic'),
                        lazy='dynamic')

我不太确定,如果对的话我再来修改答案。

冷︶言冷语的世界 2022-09-12 02:15:57

我表示分页无压力啊 完全可以用分页啊

>>> r=Role.query.get(1)
>>> r
manager
>>> r.users
<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7f5ae257a510>
>>> r.users.paginate(1, 20, None)                
<flask_sqlalchemy.Pagination object at 0x7f5ae1829150>

User 和 Role 就是多对多的,没发现楼主说的问题。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文