1

我不确定如何命名这个问题。我还简化了我的代码,因此更容易询问。假设我在 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 等。

顺便说一句,有人请告诉我一个更好的标题来给出这个问题。

4

2 回答 2

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}.

于 2011-09-22T14:13:15.910 回答
0

假设您确实link附加了对象(鉴于该link_id列不是nullable),很可能您需要与 to(eager)load的关系,Links因为当您填充视图时会话已经关闭。
有关详细信息,请参阅关系加载技术。下面的代码应该做到这一点:

submissions = dbsession.query(Submissions).options(joinedload('link'))
于 2011-09-22T07:22:14.857 回答