如何僅查詢某個表的某些列並將帶有一對多關係的字段作爲flask-sqlalchemy中的列表返回?Flask-SQLAlchemy:僅查詢某些列,將一對多關係作爲列表返回
這是我的models.py:
class Article(db.Model):
__tablename__ = 'articles'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255))
full_text = db.Column(db.Text)
authors = relationship('Person',
secondary=AssArtPer,
backref='articles'
)
class Person(db.Model):
__tablename__ = 'persons'
id = db.Column(db.Integer, primary_key=True)
full_name = db.Column(db.String(255))
AssArtPer = db.Table('ass_articles_persons',
db.Column('art_id', db.Integer, db.ForeignKey('articles.id')),
db.Column('per_id', db.Integer, db.ForeignKey('persons.id'))
)
當我做
results = Article.query.all()
編輯:我再傳遞到results
被移交給宏一個Jinja2的模板:
{% for r in results %}
{% macros.render_article(r) %}
{% endfor %}
{% macro render_article(result) %}
{% for a in result.authors %}
...render something
{% endfor %}
{% endmacro %}
現在,我想限制原來的查詢來排除Article.full_te xt列,因爲它需要很長時間,我可以稍後使用ajax調用加載全文。我知道我可以指定要查詢的某些列:
results = Article.query.with_entities(
Article.id,
Article.title,
Article.authors
).all()
但是這不起作用。查詢不會返回任何內容,也不會引發錯誤。
我嘗試了加入像這樣:
results = Article.query.join(Article.authors).with_entities(Person.id, Person.full_name)
...這是工作的罰款,但我不能指定任何其他列則。
如何組合這兩個查詢?
在您的最後一個例子,你要加入'文章'到'文章'。那是故意的嗎? – ACV
我認爲你的問題存在一些問題。首先,我不能重現你用'results = Article.query.all()'和'for results.authors獲得的行爲:' - 在這種情況下'results'是一個對象列表;您的文章類的實例。 'results.authors'甚至不應該工作。如果從結果集中取單個對象,那麼該對象將具有'authors'屬性,默認情況下該屬性可能是一個列表。我想你想要做的是定義一個懶惰的backref,這樣'.authors'返回一個查詢,你可以過濾而不是加入結果列表。 – sytech
@sytech:對,爲了簡潔起見,我還不夠清楚。實際上,我將'results'交給jinja2模板,然後將它傳遞給for循環中的宏。在宏中,我會逐個打印「results.authors」。我會相應地編輯問題。 – synul