繁体   English   中英

在sqlalchemy中按关系名称排序

[英]Ordering by relationship name in sqlalchemy

我为用户提供了这种模型。 用户可以有多个朋友,也可以是一个最好的朋友。

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

谢谢

在您的模型中, 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM