2

我有两张桌子,userscontacts。我查询该contacts表并获取用户联系人列表。然后我希望能够写Contact.first_name(表中first_name的一行在哪里users)并打印出该联系人的名字。

目前,我的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_idUser.id。也许这是我问题的根源?

我对使用 SQLAlchemy 很陌生,所以这是一个学习经验。谢谢你的帮助。

4

1 回答 1

0

您在这里拥有的是User本质上指代自身的类。换句话说,它是一种自我参照的多对多关系。您的模型定义应如下所示:

# 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
于 2013-09-23T17:31:03.287 回答