Flask数据库分页错误:“InstrumentedList对象没有属性limit”

0 投票
1 回答
37 浏览
提问于 2025-04-14 18:02

有没有办法把一个InstrumentedList对象转换一下,然后传给分页功能呢?

这是models.py的内容:

tags = sa.Table(
    'tags',
    db.metadata,
    sa.Column('post_id', sa.Integer, sa.ForeignKey('post.id'), primary_key=True),
    sa.Column('tag_id', sa.Integer, sa.ForeignKey('tag.id'), primary_key=True)
)

class Post(db.Model):
    __tablename__ = 'post'
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    body: so.Mapped[str] = so.mapped_column(sa.Text)
    timestamp: so.Mapped[datetime] = so.mapped_column(index=True, default=lambda: 
    tags: so.Mapped[List['Tag']] = so.relationship(secondary=tags, back_populates='posts', cascade='all, delete')

class Tag(db.Model):
    __tablename__ = 'tag'
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    name: so.Mapped[str] = so.mapped_column(sa.String(16), index=True)
    posts: so.Mapped[List['Post']] = so.relationship(secondary=tags, back_populates='tags', passive_deletes=True)

这是routes.py的内容:

bp.route('/tags/<name>', methods=['GET'])
def tags(name):
    page = request.args.get('page', 1, type=int)
    tag = db.session.scalar(sa.select(Tag).filter(Tag.name == name.upper()))
    pagination = db.paginate(tag.posts, page=page, per_page=current_app.config['POSTS_PER_PAGE'], error_out=False)
    posts = pagination.items
    return render_template('index.html', title=_('Tags'), posts=posts, pagination=pagination)

出现了一个错误:InstrumentedList对象没有limit这个属性

我试过:

tag= sa.select(Tag).filter(Tag.name == name.upper())

然后:

pagination = db.paginate(tag, page=page, per_page=current_app.config['POSTS_PER_PAGE'], error_out=False)

但是我得到的是<function post at 0x7fee136c9d80>,而不是一个可以循环显示的帖子对象。

1 个回答

0

如果你想对所有带有特定标签的帖子进行分页处理,可以在你的查询中使用连接(join)语句。这里提到的主键和外键是用来进行关联查询的。最后,你会得到一个分页对象,你可以按照这里的说明来使用它。

pagination = db.paginate(
    db.select(Post)
        .join(tags, tags.c.post_id == Post.id)
        .join(Tag, tags.c.tag_id == Tag.id)
        .where(sa.func.upper(Tag.name) == name.upper()), 
    page=page, 
    per_page=current_app.config['POSTS_PER_PAGE'], 
    error_out=False
)

撰写回答