2011-09-21 39 views
1

我不知道如何標題這個問題。我還簡化了我的代碼,因此更容易提問。說我有myproject.models下面的代碼在金字塔:引用金字塔/ Python/SQLAlchemy中的相關對象

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} 

我想用變色龍我的網頁上返回此:

<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等。

順便說一句,有人請告訴我一個更好的標題來給這個問題。

+0

我認爲$ {thing.link.link}會起作用,$ {thing.link}至少會顯示* something *。你確定你的提交有一個Links對象,並且Links對象有一個鏈接值嗎? – Dave

回答

2

在你的榜樣,你缺少:下面的代碼應該這樣做。你可以檢查你的看法,如果你的意見是真的加載了像

for submission in submissions: 
    print submission.id, submission.title 

然後看你的控制檯加載頁面時。

然後,當您確認您確實已加載它們時,您可以使用submission.link訪問鏈接對象。在鏈接對象中,您可以使用.link訪問鏈接屬性。

for submission in submissions: 
    print submission.link.link 

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

+0

我想這只是.all()。謝謝! –

0

假設你有附link對象(鑑於該link_id列不nullable),最有可能時需要您填充您的視圖的關係(eager)loadLinks因爲會話alread關閉。
有關更多信息,請參見Relationship Loading Techniques。在.all().query()

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