2017-01-10 52 views
1

如何僅查詢某個表的某些列並將帶有一對多關係的字段作爲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) 

...這是工作的罰款,但我不能指定任何其他列則。

如何組合這兩個查詢?

+0

在您的最後一個例子,你要加入'文章'到'文章'。那是故意的嗎? – ACV

+0

我認爲你的問題存在一些問題。首先,我不能重現你用'results = Article.query.all()'和'for results.authors獲得的行爲:' - 在這種情況下'results'是一個對象列表;您的文章類的實例。 'results.authors'甚至不應該工作。如果從結果集中取單個對象,那麼該對象將具有'authors'屬性,默認情況下該屬性可能是一個列表。我想你想要做的是定義一個懶惰的backref,這樣'.authors'返回一個查詢,你可以過濾而不是加入結果列表。 – sytech

+0

@sytech:對,爲了簡潔起見,我還不夠清楚。實際上,我將'results'交給jinja2模板,然後將它傳遞給for循環中的宏。在宏中,我會逐個打印「results.authors」。我會相應地編輯問題。 – synul

回答

0

基於this question我認爲有以下可能的工作:

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

(讓我知道,如果不是這樣,我還有一個想法。)

+0

不幸的是,它不起作用。我得到一個'InvalidRequestError:SQL表達式,列或映射實體 - 得到[',...']' – synul

+0

你說你有另外一個想法? – synul

+0

是的,我會在這個週末看到它! – ACV