我不确定如何标题这个问题。我也简化了我的代码,因此更容易提问。假设我在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}不会显示该网站的链接。
问题:
答案 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)load
与Links
的关系{1}}因为在您填充视图时会话已被关闭
有关详细信息,请参阅Relationship Loading Techniques。下面的代码应该这样做:
submissions = dbsession.query(Submissions).options(joinedload('link'))