报错提示
在使用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')