2016-09-23 106 views
0

假设我有两个模型。帐户和问题。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()) 

但我需要将account_name的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。可以控制此行为:

from sqlalchemy.orm import joinedload 

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

添加joinedload选项指示查询加载在同一时间与父母的关系,使用连接。其他急切的加载技术也可用,其可能的用例和权衡下讨论的"What Kind of Loading to Use?"

+0

非常有用,谢谢 – Juggernaut