有没有办法转换 InstrumentedList 对象并将其传递给分页?
模型.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)
路线.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 object has no attribute 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>
而不是我可以循环显示的帖子对象
如果您想对具有特定标签的所有帖子应用分页,您可以在查询中使用 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
)