我有两个表,users
和contacts
。我查询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_id
和Contact.contact_id
映射到User.id
行。也许这是我的问题的根源?
我是使用SQLAlchemy的新手,所以这是一次学习体验。谢谢你的帮助。
答案 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