无法将多个外键映射到父表

时间:2013-09-22 15:26:01

标签: python sqlalchemy

我有两个表,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的新手,所以这是一次学习体验。谢谢你的帮助。

1 个答案:

答案 0 :(得分: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