2013-09-22 65 views
2

我有兩個表,userscontacts。我查詢contacts表並獲取用戶聯繫人列表。然後,我希望能夠編寫Contact.first_name(其中first_nameusers表中的一行),並打印出該聯繫人的名字。將多個外鍵映射到父表的問題

目前,我的Contact對象不能識別user表的任何屬性。

下面是一些代碼:

class User(Base): 

    """ Basic User definition """ 

    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    first_name = Column(Unicode(255)) 
    last_name = Column(Unicode(255)) 

    contacts = relationship('Contact', backref='users') 

class Contact(Base): 

    __tablename__ = 'contacts' 

    id = Column(Integer, primary_key=True) 
    user_id = Column(Integer) 
    contact_id = Column(Integer) 

    __table_args__ = (ForeignKeyConstraint([id], [User.id]), {}) 

這裏是我的查詢:

Contact.query.filter(Contact.user_id == self.user_id).filter(Contact.state == True).all() 

說實話,我不能確定如何正確Contact.user_idContact.contact_id地圖我的兩個外鍵的User.id行。也許這是我的問題的根源?

我對使用SQLAlchemy很新,所以這是一個學習體驗。謝謝你的幫助。

回答

0

你在這裏得到的是類User,它基本上是指它自己。換句話說,這是一個self-referential many-to-many relationship。你的模型定義應該是這樣的:

# This is so called association table, which links two tables in many-to-many 
# relationship. In this case it links same table's ('users') different rows. 
user_contacts = Table(
    'user_contacts', Base.metadata, 
    Column('user_id', Integer, ForeignKey('users.id'), primary_key=True), 
    Column('contact_id', Integer, ForeignKey('users.id'), primary_key=True), 
) 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    first_name = Column(String) 
    last_name = Column(String) 
    contacts = relationship(
     'User', 
     secondary=user_contacts, 
     primaryjoin=id==user_contacts.c.user_id, 
     secondaryjoin=id==user_contacts.c.contact_id 
    ) 

然後,你可以做的事情如下所示:

u1 = User(first_name='Foo', last_name='Foo') 
u2 = User(first_name='Bar', last_name='Bar') 
u3 = User(first_name='Baz', last_name='Baz') 
u1.contacts = [u2, u3] 
session.add(u1) 
session.commit() 

# ... and in some other place in your code ... 

u = User.query.get(1) 
print u.contacts[0].first_name