2014-05-13 58 views
1

這是我想要的模型的情況:如何設計同爲2個表之間的2個不同的許多一對多的關係與backref的/ back_populate的

users,這可以劃分爲riderdriver。每個ride具有riderdriver。我可以想象使用ride對象,在那裏我可以打電話ride.driverride.rider。但是我發現很難在另一個方向上推論它。對於任何用戶u,當我撥打u.rides時,不清楚是否應該返回其中u是駕駛員或駕駛員的乘坐。

我也可以單獨有兩個關係,以便u.rides_as_driver返回乘坐者,其中u是驅動程序,u.rides_as_rider返回乘車者,其中u是乘客。

這是一個很好的方法來模擬我剛剛描述的關係嗎?

更新

如果這是一個好辦法,我怎麼在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) 

回答

3

事實上,你應該使用兩個relationship是你的結論反映,這不僅代表這個連接的好方法,它是唯一的出路

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") 
相關問題