![](/img/trans.png)
[英]Ordering SQLAlchemy relationship by another field, not by primary key
[英]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()
谢谢
在您的模型中, 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.