Database 查询返回每个条目的每个封面(以db为单位)?

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

我的查询似乎为每个封面返回一个条目。也就是说,如果数据库中有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.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)
然后在Jinja2
list.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 %}