2017-01-10 5 views
1

테이블의 특정 열만 쿼리하고 flask-sqlalchemy의 목록으로 일대 다 관계가있는 필드를 반환하려면 어떻게해야합니까? 내가Flask-SQLAlchemy : 특정 열만 쿼리하고 목록으로 일대 다 관계를 반환합니다.

results = Article.query.all() 

편집 작업을 수행 할 때

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')) 
    ) 

:

내 models.py입니다 그때 매크로에 넘겨되는 jinja2 템플릿에 results을 전달하고있다 :

{% 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() 

그러나 이것은 작동하지 않습니다. 쿼리는 아무 것도 반환하지 않으며 오류도 throw하지 않습니다.

는 나는 그렇게 같이 참여했습니다 : 잘 작동

results = Article.query.join(Article.authors).with_entities(Person.id, Person.full_name) 

을 ...,하지만 난 다음 다른 열을 지정할 수 없습니다.

어떻게 두 쿼리를 결합 할 수 있습니까?

+0

당신은'제에 가입하고 '에'기사'. 그게 의도적 인거야? – ACV

+0

질문에 약간의 문제가 있다고 생각합니다. 한 가지만 말하면,'results = Article.query.all()'및'for name in results.authors :'의 결과를 재현 할 수 없습니다.'이 경우'results'는 객체의 목록입니다. Article 클래스의 인스턴스. 'results.authors'는 작동하지 않아야합니다. 결과 세트에서 하나의 객체를 가져 오는 경우, 그 객체는'authors' 속성을 갖게 될 것입니다.이 속성은 아마도 기본적으로리스트 일 것입니다. 필자가 생각한 것은 지연된 역 참조를 정의하는 것입니다. 그래서'.authors'는 조인 된 결과 목록 대신 필터링 할 수있는 쿼리를 반환합니다. – sytech

+0

@sytech : 맞습니다. 간결함을 위해 저는 충분히 명확하지 않았습니다. 실제로'결과 '를 jinja2 템플릿에 넘겨주고, for-loop 내부의 매크로에 전달합니다. 매크로에서'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 표현식, 열 또는 매핑 된 엔티티가 예상됩니다 - 0x7f8bf3f87650>, '...']의 '가 있습니다. – synul

+0

다른 생각이 있다고하셨습니까? – synul

+0

예, 이번 주말에 나옵니다! – ACV