Database 查询返回每个条目的每个封面(以db为单位)?
我的查询似乎为每个封面返回一个条目。也就是说,如果数据库中有3个封面,那么查询将返回条目#1三次,每次返回不同的封面。因为我有7个条目,所以我得到了21个结果。如何构造查询以返回与条目关联的封面 以下是我所拥有的:Database 查询返回每个条目的每个封面(以db为单位)?,database,flask,flask-sqlalchemy,Database,Flask,Flask Sqlalchemy,我的查询似乎为每个封面返回一个条目。也就是说,如果数据库中有3个封面,那么查询将返回条目#1三次,每次返回不同的封面。因为我有7个条目,所以我得到了21个结果。如何构造查询以返回与条目关联的封面 以下是我所拥有的: @app.route('/list', methods=['GET', 'POST']) def list(): entries = Book.query.order_by(Book.id.desc()).all() cvr_entries = Cover.query
@app.route('/list', methods=['GET', 'POST'])
def list():
entries = Book.query.order_by(Book.id.desc()).all()
cvr_entries = Cover.query.filter(Cover.book).all()
### Other queries I've tried ###
# cvr_entries = Cover.query.join(Cover.book).all()
# cvr_entries = Cover.query.filter(Cover.book.any())
# cvr_entries = Cover.query.filter(Cover.book.any()).all()
return render_template(
'list.html',
entries=entries,
cvr_entries=cvr_entries)
这是/list
输出页面:
{% for entry in entries %}
{% for cvr in cvr_entries %}
<article class="entry">
<img src="/static/data/covers/{{ cvr.name }}" alt="Cover for {{ entry.title }}" />
<ul class="entry-info">
<li class=""><h2>{{ entry.title }}</h2></li>
<li class="">Summary: {{ entry.summary|truncate( 30, true ) }}</li>
</ul>
</article>
{% endfor %}
{% endfor %}
所以这是一个半身像。我不明白如何构建查询
这是@jonafato要求的我的模型:
book_to_cover = db.Table('book_to_cover',
db.Column('cover_id', db.Integer, db.ForeignKey('cover.id')),
db.Column('book_id', db.Integer, db.ForeignKey('book.id'))
)
class Book(db.Model):
__tablename__ = 'book'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String())
summary = db.Column(db.Text)
book_to_cover = db.relationship('Cover', secondary=book_to_cover,
backref=db.backref('book', lazy='dynamic'))
def __repr__(self):
return "<Book (title='%s')>" % (self.title)
class Cover(db.Model):
__tablename__ = 'cover'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
def __repr__(self):
return "<Cover (name='%s')>" % self.name
book-to-cover=db.Table('book-to-cover',
db.Column('cover_id',db.Integer,db.ForeignKey('cover.id')),
db.Column('book\u id',db.Integer,db.ForeignKey('book.id'))
)
教材(数据库模型):
__tablename_uuu='book'
id=db.Column(db.Integer,主键=True)
title=db.Column(db.String())
summary=db.Column(db.Text)
账簿到账簿封面=数据库关系(“封面”,次要=账簿到账簿封面,
backref=db.backref('book',lazy='dynamic'))
定义报告(自我):
返回“”%(self.title)
类别封面(db.型号):
__tablename_uuu=‘封面’
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String())
定义报告(自我):
返回“%self.name”
通常,您要迭代模型——您的关系应该允许您执行以下操作:
books = Book.query.all()
return render_template('list.html', books=books)
然后在Jinja2list.html
模板中:
{% for book in books %}
<h3>{{ book }}</h3>
<ul>
{% for cover in book.book_to_cover %}
<li>{{ cover }}</li>
{% endfor %}
</ul>
{% endfor %}
{%forbook-in-books%}
{{book}}
{book.book_to_cover%}
- {{cover}}
{%endfor%}
{%endfor%}
将
书籍重命名为\u cover
为cover
会更自然,以便在访问模型时使其更像自然语言。您可以发布您的SQLAlchemy模型吗?特别是,您是否在书籍
和封面
之间定义了一种关系(带有反向引用)?如果是这样,您应该能够完全删除cvr\u条目
查询,并将for
循环的内部更改为类似于{%for cvr in entry.covers%}
。除了我之前的评论之外,您还可以使用a来防止循环内部不必要的查询。@jonafato我尝试了cvr\u条目=Cover.query.options(联合载荷(封面、书本))
,但我得到了名称错误:未定义全局名称“joinedload”
。我也尝试了条目。Cover
方法,但没有返回任何条目。您必须从sqlalchemy.orm
导入joinedload
,然后才能使用它。我导入了它并得到了错误InvalidRequestError:“Cover.book”不正确吗ot支持对象填充-无法应用急切加载。
我找到了一个解决方案,但不起作用。我还将加载从动态
更改为加入
,但没有效果。
{% for book in books %}
<h3>{{ book }}</h3>
<ul>
{% for cover in book.book_to_cover %}
<li>{{ cover }}</li>
{% endfor %}
</ul>
{% endfor %}