如何在SQLAlchemy中为同一个表定义两个关系

ric*_*lla 20 python sql sqlalchemy relationship

我查看了SQLAlchemy教程和其他类似的问题,但我似乎很难让这个联接工作:

场景:我有一个pagesPage模型表示的表.页面可以由用户创建并由用户编辑,但不一定是相同的.我的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))
Run Code Online (Sandbox Code Playgroud)

我的用户存储在User模型所代表的users表中.正如我所说的那样,我一直在寻找SQLAlchemy文档,我试图让它看起来尽可能与它们的例子相似,但是没有用.任何帮助将不胜感激.

ReW*_*ite 14

从版本0.8开始,SQLAlchemy可以仅使用foreign_keys关键字参数来解决模糊连接relationship.

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])
Run Code Online (Sandbox Code Playgroud)

http://docs.sqlalchemy.org/en/rel_0_9/orm/join_conditions.html#handling-multiple-join-paths上的文档


van*_*van 8

我觉得你几乎做对了; 只有代替Model名称才能Table在定义时使用名称primaryjoin.而不是

# 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")
Run Code Online (Sandbox Code Playgroud)

使用:

# 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")
Run Code Online (Sandbox Code Playgroud)

  • 这可能是你帮助我解决的第 20 个 sqlalchemy 问题 (3认同)

min*_*hee 4

尝试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)
Run Code Online (Sandbox Code Playgroud)

  • 当您添加“foreign_keys”并且连接条件可推导时,无需添加“primaryjoin”属性。 (2认同)