2011-09-25 54 views
14
定義兩個關係到同一個表

我找遍了整個SQLAlchemy的教程和其他類似的問題,但我似乎努力讓該連接工作:如何在SQLAlchemy的

場景:我有模型代表的pages表。頁面可以由用戶創建並由用戶編輯,但不一定是相同的。我Page模型看起來像這樣(有刪節):

class Page(Base): 
    __tablename__ = 'pages' 

    id = Column(Integer, primary_key = True) 
    slug = Column(Text) 
    title = Column(Text) 
    direct_link = Column(Text) 
    body = Column(Text) 
    category_id = Column(Integer, ForeignKey('categories.id')) 
    published_on = Column(DateTime) 
    publishing_user_id = Column(Integer, ForeignKey('users.id')) 
    last_edit_on = Column(DateTime) 
    last_edit_user_id = Column(Integer, ForeignKey('users.id')) 

    # Define relationships 
    publish_user = relationship('User', backref = backref('pages', order_by = id), primaryjoin = "Page.publishing_user_id == User.id") 
    edit_user = relationship('User', primaryjoin = "Page.last_edit_user_id == User.id") 
    category = relationship('Category', backref = backref('pages', order_by = id)) 

我的用戶存儲在由User模型所表示的用戶表。正如我所說的,我一直在尋找這個SQLAlchemy文檔,我試圖讓它看起來儘可能類似於他們的例子,但不是沒有用。任何幫助將不勝感激。

+0

林不知道香港專業教育學院設置了正確的什麼我想要它做的文檔。我希望能夠從查詢中獲取頁面,並調用page.publish_user來獲取發佈用戶。我試過下面的建議,但仍然沒有運氣 – richzilla

+0

你說它不工作,但你能更具體 - 一個錯誤,一個意外的返回值,是什麼?我沒有在您發佈的代碼中看到任何明顯的問題。 – FMc

回答

2

嘗試foreign_keys選項:

publish_user = relationship(User, foreign_keys=publishing_user_id, 
            primaryjoin=publishing_user_id == User.id, 
            backref=backref('pages', order_by=id)) 
edit_user = relationship(User, foreign_keys=last_edit_user_id, 
           primaryjoin=last_edit_user_id == User.id) 
+1

當你添加foreign_keys並且連接條件可以被忽略時,不需要添加primaryjoin屬性。 – user2683246

7

我覺得你差不多了它的權利;只能在定義primaryjoin時代替Model名稱使用Table名稱。因此,而不是

# Define relationships 
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "Page.publishing_user_id == User.id") 
edit_user = relationship('User', 
    primaryjoin = "Page.last_edit_user_id == User.id") 

使用:

# Define relationships 
publish_user = relationship('User', backref = backref('pages', order_by = id), 
    primaryjoin = "pages.publishing_user_id == users.id") 
edit_user = relationship('User', 
    primaryjoin = "pages.last_edit_user_id == users.id")