![](/img/trans.png)
[英]SQLAlchemy query adding pseudo-column of related data as an array of dicts
[英]Adding related column to query results?
I have a setup in SQLAlchemy ORM (using Flask-SQLAlchemy) with Book
and BookSubject
classes, the latter being a many-to-many relationship (there is, of course, a Subject
class, but it's not relevant to this question). 我有一个工作查询,可根据主题添加到数据库的日期返回所有书籍(这是有原因的):
records = Book.query.\
filter(BookSubject.book_id == Book.id).\
filter(BookSubject.subject_id.in_([1, 12, 17])).\
filter(BookSubject.created > '2021-01-01').\
order_by(db.desc(BookSubject.created)).\
paginate(page, 50, True)
然后我将records
传递给 Jinja2 模板并做各种事情来显示它; 它完美地工作。
我现在想做显而易见的事情并实际显示创建日期(即BookSubject.created
,来自 order_by 子句),但我不知道如何将其添加到查询中。 放入add_columns((BookSubject.created).label("added"))
不是答案; 当我尝试使用其中一个记录对象“'sqlalchemy.util._collections.result object'没有属性'id'”时会引发错误。 生成它的模板代码(大致)是:
{% for book in records.items %}
<tr><td><a href="{{ url_for('fullview', id=book.id) }}">{{ book.title }}</a></td></tr>
{% endfor %}
这应该是显而易见的; 我如何将其添加到结果中?
通过使用add_columns
Book.query.add_columns((BookSubject.created).label("added"))
它将返回一个带有字段Book
和added
的命名元组,因此要访问 book 字段,您需要类似book.Book.id
{% for book in records.items %}
<tr><td>
<a href="{{ url_for('fullview', id=book.Book.id) }}">{{ book.Book.title }} {{ book.added }} </a>
</td></tr>
{% endfor %}
或成对迭代:
{% for book, added in records.items %}
<tr><td>
<a href="{{ url_for('fullview', id=book.id) }}">{{ book.title }} {{ added }} </a>
</td></tr>
{% endfor %}
如果您想要一个平面结构(并且没有add_columns
),那么您可以使用
session.query(
Book.id,
Book.title,
BookSubject.created.label('added')
).filter(BookSubject.book_id == Book.id)...
然后 results 将有一个包含字段id
、 title
和added
的命名元组,因此您可以直接打印book.id
:
{% for book in records.items %}
<tr><td>
<a href="{{ url_for('fullview', id=book.id) }}">{{ book.title }} {{ book.added }} </a>
</td></tr>
{% endfor %}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.