【问题标题】:Flask-SQLAlchemy: Query only certain columns, return one-to-many relationships as listsFlask-SQLAlchemy:仅查询某些列,以列表形式返回一对多关系
【发布时间】: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)

...工作正常,但我不能指定任何其他列。

如何组合这两个查询?

【问题讨论】:

  • 在上一个示例中,您将加入 ArticleArticle。这是故意的吗?
  • 我认为您的问题存在一些问题。一方面,我无法重现您使用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


【解决方案1】:

基于this question,我认为以下可能可行:

results = (
    Article.query.join(Person).
    with_entities([
        Article.id,
        Article.title,
        Article.authors,
        Person.id,
        Person.full_name]).all()

(如果没有,请告诉我,我有另一个想法。)

【讨论】:

  • 不幸的是,它不起作用。我收到了InvalidRequestError: SQL expression, column, or mapped entity expected - got ['<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f8bf3f87650>, ... ']
  • 你说你有别的想法?
  • 好的,这个周末我会去的!
  • with_entities() 需要位置参数,而不是列表。
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 2018-08-28
  • 1970-01-01
  • 2012-09-17
  • 2016-06-15
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多