SQLAlchemy通过多对多关系进行排序

这是我当前模型的简化示例(我正在使用Flask SQLAlchemy扩展):

like = db.Table(

'like',

db.Column('uid', db.Integer, db.ForeignKey('users.id')),

db.Column('pid', db.Integer, db.ForeignKey('posts.id'))

)

class User(db.Model):

__tablename__ = 'users'

id = db.Column(db.Integer, primary_key = True)

username = db.Column(db.String(20))

class Post(db.Model):

__tablename__ = 'posts'

id = db.Column(db.Integer, primary_key = True)

title = db.Column(db.String(255))

likes = db.relationship(

'User',

secondary = like,

backref = db.backref('likes', lazy = 'dynamic'),

lazy = 'dynamic'

)

我正在尝试Post按喜欢的次数订购。

这是我基本上想发出的查询:

SELECT p.*, COUNT(l.`pid`) as `likes`

FROM `posts` as p

LEFT JOIN `like` as l

ON p.`id` = l.`pid`

GROUP BY p.`id`

ORDER BY `likes` DESC

我只是无法在SQLAlchemy方面进行任何工作。

感谢您提供任何帮助。

回答:

我没有使用SQLAlchemy,所以我想尝试一下。我没有尝试使用你的模型,我只是写了一些新模型(尽管足够类似):

likes = db.Table('likes',

db.Column('user_id', db.Integer, db.ForeignKey('user.id')),

db.Column('post_id', db.Integer, db.ForeignKey('post.id'))

)

class User(db.Model):

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(20))

def __repr__(self):

return "<User('%s')>" % self.username

class Post(db.Model):

id = db.Column(db.Integer, primary_key=True)

title = db.Column(db.String(255))

likes = db.relationship('User', secondary = likes,

backref = db.backref('posts', lazy='dynamic'))

def __repr__(self):

return "<Post('%s')>" % self.title

你想要加入likes表格,用于func.count计算喜欢数,group_by Post然后使用order_by:

db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')

我发现ORM教程和SQLAlchemy文档的其余部分非常有用。

以上是 SQLAlchemy通过多对多关系进行排序 的全部内容, 来源链接: utcz.com/qa/428411.html

回到顶部