【问题标题】:How to design 2 different many-to-many relationships between same 2 tables with backref's / back_populate's如何使用 backref's / back_populate's 在相同的 2 个表之间设计 2 个不同的多对多关系
【发布时间】:2014-05-13 16:03:11
【问题描述】:

这是我试图模拟的情况:

users,可分为riderdriver。每个ride 都有一个rider 和一个driver。我可以想象使用ride 对象,我可以在其中调用ride.driverride.rider。但我发现很难从另一个方向推断它。对于任何用户u,当我调用u.rides 时,不清楚它是否应该返回u 是司机或骑手的游乐设施。

我也可以分别有两个关系,这样u.rides_as_driver 返回你是司机的游乐设施,u.rides_as_rider 返回你是骑手的游乐设施。

这是对我刚才描述的关系建模的好方法吗?

更新

如果这是一个好方法,我如何在 SQLAlchemy 中实现这一点?特别是在这个设计中如何使用 backref?

接下来是我的尝试:

class Ride:
    driver = db.Relationship('User', primaryjoin=driver_id==user.id)
    rider =  db.Relationship('User', primaryjoin=rider_id==user.id)
class User:
    rides_as_rider = db.Relationship('Ride', primaryjoin=id==ride.rider_id)
    rides_as_driver = db.Relationship('Ride', primaryjoin=id==ride.driver_id)

【问题讨论】:

    标签: python sqlalchemy relationship


    【解决方案1】:

    确实,您应该使用两个relationships 的结论反映了这不仅是表示这种连接的好方法,这是唯一的方法

    relationship 不是远程表,在您的情况下为Ride,而是表之间的连接。 RideUser 之间有两个连接,用于每个用户在骑行中可能扮演的两个角色。

    要获得更多关于这一事实的证据,请注意您还有两个relationship 背对Ride,朝向User,一个用于连接的每个分支。由于您有其中两个,因此您还需要不同的 backref,每个一个。

    但是,您的代码还不够。你应该告诉sqlalchemy“这种关系就是那个关系,只是倒退”。事实上,你有四种关系,其中没有一个知道另一个的存在。这将表现为Ride.driver 的变化的神秘效应,而不会反映在User.rides_as_driver 中。

    修复很简单,不过,为每个关系添加一个back_populates,sqlalchemy 将使它们保持同步:

    class Ride:
        driver = db.Relationship('User', primaryjoin=driver_id==user.id, back_populates="rides_as_driver")
        rider =  db.Relationship('User', primaryjoin=rider_id==user.id, back_populates="rides_as_rider")
    class User:
        rides_as_rider = db.Relationship('Ride', primaryjoin=id==ride.rider_id, back_populates="rider")
        rides_as_driver = db.Relationship('Ride', primaryjoin=id==ride.driver_id, back_populates="driver")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多