在Pyramids / Python / SQLAlchemy中引用相关对象

时间:2011-09-21 21:49:54

标签: python sqlalchemy pyramid chameleon template-tal

我不确定如何标题这个问题。我也简化了我的代码,因此更容易提问。假设我在Pyramid中的myproject.models中有以下代码:

class Links(Base):
    __tablename__ = 'links'
    id = Column(Integer, primary_key=True)
    link = Column(Text)

    def __init__(self, link):
        self.link = link

class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link = relationship(Links)

    def __init__(self, title, link):  
    self.title = title
        self.link = link

视图非常简单:

def my_view(request):
    dbsession = DBSession()
    submissions = dbsession.query(Submissions)
    return {'submissions':submissions}

我想使用Chameleon在我的页面上返回:

<p tal:repeat="thing submissions">
    ${thing.title} ${thing.link}
</p>

但是,$ {thing.link}不会显示该网站的链接。

问题:

  1. 我如何参考thing.link的链接?直觉上,我会输入$ {thing.link.link},但这不起作用。
  2. 如何引用任意子类?我希望能够从对象的子类中提取任何属性,例如,thing.link.link,thing.link.domain,thing.link.created等。
  3. 顺便说一句,有人请告诉我一个更好的标题来提出这个问题。

2 个答案:

答案 0 :(得分:2)

在您的示例中,您错过了.all()之后的.query()。您可以通过执行类似

之类的操作来检查您的提交是否真正加载
for submission in submissions:
    print submission.id, submission.title

然后在加载页面时观察您的控制台。

然后,当您确认已加载它们时,可以使用submission.link访问链接对象。在链接对象中,您可以使用.link访问链接属性。

for submission in submissions:
    print submission.link.link

因此,在您的模板中,您可以编写${thing.link.link}

答案 1 :(得分:0)

假设您确实附加了link个对象(鉴于link_id列不是nullable),您很可能需要(eager)loadLinks的关系{1}}因为在您填充视图时会话已被关闭 有关详细信息,请参阅Relationship Loading Techniques。下面的代码应该这样做:

submissions = dbsession.query(Submissions).options(joinedload('link'))