2016-09-23 4 views
0

두 모델이 있다고 가정합니다. 계정 및 질문. 내가 제공된 질문 ID에서 JSON 형식의 질문을 반환하는 방법을 가지고slqlachemy가 변수 선언에 의해로드 됨

class Question(DeclarativeBase): 
    __tablename__ = 'questions' 

    id = Column(Integer, primary_key=True) 
    content = Column(Unicode(2500), nullable=False) 
    account_id = Column(Integer, ForeignKey(
    'accounts.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False) 
    account = relationship('Account', backref=backref('questions')) 

: 같은

class Account(DeclarativeBase): 
    __tablename__ = 'accounts' 

    id = Column(Integer, primary_key=True) 
    user_name = Column(Unicode(255), unique=True, nullable=False) 

내 질문 모델을합니다. 이 방법이 아래와 같을 경우 id contentaccount_id을 반환합니다.

@expose('json') 
    def question(self, question_id): 
     return dict(questions=DBSession.query(Question).filter(Question.id == question_id).one()) 

계정의 user_name도 json 응답에 포함되어야합니다. 이상한 (적어도 나에게) 뭔가를 명시 적으로 쿼리 결과를 계정에 관계가 포함 된이 방법은 계정 정보를 json 응답에 포함될 것이라고 명시해야합니다.이 같은 일을 의미합니다.

@expose('json') 
    def question(self, question_id): 
     result = DBSession.query(Question).filter(Question.id == question_id).one() 
     weird_variable = result.account.user_name 
     return dict(question=result) 

왜 이런 일을해야합니까? 이 이유는 무엇입니까? Relationship Loading Techniques에서

답변

2

는 :

기본적으로

모든 객체 간 관계는 지연로드 있습니다. 당신이 Question 인스턴스의 account 속성에 액세스 할 때 기본 구성의 관계 계정에서 즉

은 실제로 당신이 Question를 가져올 때 계정 데이터를로드,하지만하지 않습니다. 이 동작을 제어 할 수 있습니다 다음 joinedload 옵션을 추가

from sqlalchemy.orm import joinedload 

DBSession.query(Question).\ 
    filter(Question.id == question_id).\ 
    options(joinedload('account')).\ 
    one() 

조인을 사용하여, 부모와 동시에 관계를로드하는 쿼리를 지시한다. 다른 열심히 로딩 기술도 사용할 수 있습니다. 사용 가능한 케이스와 교환 방법은 "What Kind of Loading to Use?"

+0

매우 유용합니다. 감사합니다. – Juggernaut

관련 문제