2011-09-25 11 views
14

He mirado por todo el tutorial SQLAlchemy y otras preguntas similares pero parecen estar luchando para conseguir esto se unen para trabajar:Cómo definir dos relaciones a la misma mesa en SQLAlchemy

El escenario: I tener una tabla pages representada por el modelo Page. Las páginas pueden ser creadas por un usuario y editadas por un usuario, pero no necesariamente la misma. Mi modelo Page se parece a esto (abreviada):

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)) 

Mis usuarios se almacenan en la tabla de usuarios representado por el modelo User. Como dije, he estado en todos los documentos de SQLAlchemy buscando esto, he intentado que se vea lo más parecido posible a su ejemplo, pero no ha sido en vano. Cualquier ayuda sería muy apreciada.

+0

No estoy seguro de que he configurarlo adecuado para lo que quiero que haga. Deseo poder obtener una página de una consulta y llamar a page.publish_user para obtener el usuario de publicación. He intentado la sugerencia a continuación, pero todavía no tengo suerte. – richzilla

+0

Usted dice que no está funcionando, pero puede ser más específico, un error, un valor de retorno inesperado, ¿qué? No veo ningún problema obvio en el código que has publicado. – FMc

Respuesta

2

Trate foreign_keys opción:

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

Cuando agrega '' foreign_keys'' y la condición de unión es deducible, no hay necesidad de agregar atributos '' primaryjoin''. – user2683246

7

Creo que casi lo hizo bien; solo en lugar de los nombres Model debe usar los nombres Table al definir primaryjoin. Así que en lugar de

# 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") 

uso:

# 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") 
Cuestiones relacionadas