【发布时间】:2017-05-25 03:58:03
【问题描述】:
如何仅查询表的某些列并返回具有一对多关系的字段作为 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_text 列,因为这需要很长时间,而且我可以稍后通过 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)
...工作正常,但我不能指定任何其他列。
如何组合这两个查询?
【问题讨论】:
-
在上一个示例中,您将加入
Article到Article。这是故意的吗? -
我认为您的问题存在一些问题。一方面,我无法重现您使用
results = Article.query.all()和for name in results.authors:获得的行为——在这种情况下,results是一个对象列表; Article 类的实例。results.authors甚至不应该工作。如果您从该结果集中获取单个对象,则该对象将具有authors属性,默认情况下可能是一个列表。我认为您想要做的是定义一个惰性反向引用,以便.authors返回一个您可以过滤的查询,而不是一个连接的结果列表。 -
@sytech:是的,为了简洁起见,我还不够清楚。我实际上将
results交给了一个jinja2 模板,然后将它传递给for 循环内的一个宏。然后在宏中我一一打印results.authors。我会相应地编辑问题。 -
@synul 你能找出解决办法吗?
标签: mysql python-2.7 flask sqlalchemy flask-sqlalchemy