2011-09-25 5 views
14
で同じテーブルに2つの関係を定義する方法

私はSQLAlchemyのチュートリアルや他の同様の質問を介してすべてを見てきたが、私はこれが機能するために参加を得るのに苦労しているように見える:はSQLAlchemyの

シナリオを:私はモデルはPageで表される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モデルで表現usersテーブルに格納されています。私が言いましたように、私はSQLAlchemyのドキュメントを探していましたが、可能な限り同じように見せるようにしましたが、無駄はありません。どんな助けでも大歓迎です。

+0

イム私はそれがやりたいことのために右のそれを設定アイブわからないで

publish_user = relationship(User, foreign_keys=[publishing_user_id], backref=backref('pages', order_by=id)) edit_user = relationship(User, foreign_keys=[last_edit_user_id]) 

ドキュメント。私は、クエリからページを取得し、パブリッシングユーザーを取得するためにpage.publish_userを呼び出すことができるようにしたい。 Iveは以下の提案を試しましたが、まだ運がありません – 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''を追加してjoin条件を推論できる場合、 '' primaryjoin''属性を追加する必要はありません。 – user2683246

7

を、私はあなたがほとんど右のそれを得たと思います。 Modelの名前の代わりに、primaryjoinを定義するときは、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")