@Wolph 的回答完全涵盖了您的问题。
作为替代方案:如果你的表 Follower
只是为了启用多对多关系,你可以将它建模得更更干净:
users_followers = Table(
'users_follower', Base.metadata,
Column('id', Integer, primary_key=True),
Column('from_user', ForeignKey('user.id')),
Column('to_user', ForeignKey('user.id')),
UniqueConstraint('from_user', 'to_user', name='UC_users_follower'),
)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
followers = relationship(
'User',
secondary=users_followers,
primaryjoin=id == users_followers.c.to_user,
secondaryjoin=id == users_followers.c.from_user,
backref="followees",
# cascade='all',
)
在这种情况下,您可以按如下方式编写查询:
U1 = aliased(User, name="u1")
U2 = aliased(User, name="u2")
q = (session
.query(
U1, U2,
U2.followers.any(User.id == U1.id).label("followed_back"),
)
.join(U2, U1.followers)
# .filter(...)
# .order_by(...)
)
for u1, u2, follows in q:
print(u1, u2, follows)
这个查询不会更快,但它更容易与模型相关联,它还为您提供有关用户的其他信息(姓名等),我认为您无论如何都需要这些信息。
我是一名优秀的程序员,十分优秀!