2013-09-22 26 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