Flask-SQLAlchemy:仅查询某些列,将一对多关系作为列表

时间:2017-01-10 15:39:08

标签: mysql python-2.7 flask sqlalchemy 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_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)

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

如何组合这两个查询?

1 个答案:

答案 0 :(得分:-1)

基于this question我认为以下内容可能有效:

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

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