我有这种用户模型。用户可以拥有多个朋友,也可以拥有一个最好的朋友。
friendship = Table('friendship', Base.metadata,
Column('m1_id', Integer, ForeignKey('user.id')),
Column('m2_id', Integer, ForeignKey('user.id'))
)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True)
email = Column(String(120), unique=True, info={'validators': Email()})
age = Column(Integer())
best_friend_id = Column(Integer, ForeignKey('user.id'))
best_friend = relationship(lambda: User, remote_side=[id])
friends = relationship('User',
secondary=friendship,
primaryjoin=id==friendship.c.m1_id,
secondaryjoin=id==friendship.c.m2_id,
backref=backref('ofriends', lazy='dynamic'),
lazy='dynamic'
)
我试图获得一个包含朋友数量的查询,并按照最好的朋友的名字排序,但我无法弄清楚如何。
query = db_session.query(User, func.count(friendship)-1).join(friendship, User.id==friendship.c.m1_id).group_by(User)
然后失败了:
query.order_by(User.best_friend.name).all()
谢谢
答案 0 :(得分:1)
friendship
和best_friend
不相关。如果您想在查询中使用best_friend
关系,则必须以某种方式加入它;由于这是一个自连接,您还需要为User
的左右实例提供一个别名,以便区分它们。
以下查询为用户及他们拥有的朋友总数,按其最好朋友的名字排序(有关最好朋友的数据未包含在结果集中)
>>> best_friend_alias = sa.orm.aliased(User)
>>> query = (Query([User, sa.func.count(friendship)-1])
... .join(friendship, User.id==friendship.c.m1_id)
... .join((best_friend_alias, User.best_friend))
... .group_by(User)
... .order_by(best_friend_alias.name))
>>> print query
SELECT "user".id AS user_id, "user".name AS user_name, "user".email AS user_email, "user".age AS user_age, "user".best_friend_id AS user_best_friend_id, count() - :count_1 AS anon_1
FROM "user" JOIN friendship ON "user".id = friendship.m1_id JOIN "user" AS user_1 ON user_1.id = "user".best_friend_id GROUP BY "user".id, "user".name, "user".email, "user".age, "user".best_friend_id ORDER BY user_1.name