在sqlalchemy中按关系名称排序

时间:2014-04-11 21:02:41

标签: python sqlalchemy flask

我有这种用户模型。用户可以拥有多个朋友,也可以拥有一个最好的朋友。

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()

谢谢

1 个答案:

答案 0 :(得分:1)

在您的模型中,

friendshipbest_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
相关问题