【问题标题】:How to define two relationships to the same table in SQLAlchemy如何在 SQLAlchemy 中定义与同一张表的两个关系
【发布时间】:2011-11-24 18:29:36
【问题描述】:

我已经查看了 SQLAlchemy 教程和其他类似问题,但我似乎很难让这个加入工作:

场景:我有一个pages 表,由Page 模型表示。页面可以由用户创建并由用户编辑,但不一定相同。我的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 文档,我试图让它看起来尽可能与他们的示例相似,但无济于事。任何帮助将不胜感激。

【问题讨论】:

  • 我不确定我是否将它设置为我想要它做的事情。我希望能够从查询中获取页面,并调用 page.publish_user 来获取发布用户。我尝试了下面的建议,但仍然没有运气
  • 你说它不起作用,但你能更具体一点——一个错误,一个意外的返回值,什么?我在您发布的代码中没有发现任何明显的问题。

标签: python sql sqlalchemy relationship


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为你几乎是对的;在定义primaryjoin 时,您应该使用Table 名称而不是Model 名称。所以不是

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

    【讨论】:

    • 这可能是你帮助我解决的第 20 个 sqlalchemy 问题
    【解决方案3】:

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

    【讨论】:

    • 添加foreign_keys且连接条件可推演时,无需添加primaryjoin属性。
    猜你喜欢
    • 2016-01-26
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多