2016-09-23 6 views
0

2つのモデルがあるとします。アカウントと質問。slqlachemyが変数宣言によって荷重に加算されました

class Account(DeclarativeBase): 
    __tablename__ = 'accounts' 

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

、私の質問のモデルは次のようになる:

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

私が提供質問IDからJSON形式で質問を返すメソッドを得ました。 このメソッドが以下のような場合は、idcontentaccount_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) 

なぜこのようなことをしなければなりませんか?これの背後にある理由は何ですか?

答えて

2

Relationship Loading Techniquesから:

デフォルトでは、すべてのオブジェクト間の関係は、遅延ローディングです。デフォルト設定では言い換えれば

あなたがQuestionをフェッチするときの関係アカウントは、実際にアカウントデータをロードしていませんが、あなたはQuestionインスタンスのaccount属性にアクセスするとき。この動作を制御することができます: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

関連する問題