flask-sqlalchemy 多对多关系使用分页错误

flask-sqlalchemy分页使用

报错提示

在使用sqlalchemy的分页功能时提示出错:

AttributeError: 'InstrumentedList' object has no attribute 'paginate'

源代码

article_tag = db.Table('article_tag',
                       db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True),
                       db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True)
                       )
class Tag(db.Model):
    type_text = "标签"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))

class Article(db.Model):
    type_text = "文章"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    excerpt = db.Column(db.String(100))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles'), lazy='dynamic')

报错复现

article = Article.filter.first()
tags = article.tags
tags_paginate = tags.paginate(per_page=10)
# 这里引用成功 tags 是query对象,artcile_paginate返回的是分页对象

tag = Tag.filter.first()
article = tag.articles
artcile_paginate = article.paginate(per_page=10)
'''
这里发生报错:
AttributeError: 'InstrumentedList' object has no attribute 'paginate'
article = tag.articles 返回的是结果列表集,不是query对象,没有分页方法.paginate()
'''

解决方案

定义Article类时,需要注意relationship的反向引用

class Article(db.Model):
    type_text = "文章"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    excerpt = db.Column(db.String(100))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    # tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles'), lazy='dynamic')
    tags = db.relationship('Tag', secondary=article_tag, backref=db.backref('articles', lazy='dynamic'), lazy='dynamic')

参考文章:Flask-sqlalchemy中的lazy的解释

猜你喜欢

转载自blog.csdn.net/weixin_39595606/article/details/89492113