Sqlalchemy ordinando per contare su molti a molte relazioni
-
12-11-2019 - |
Domanda
Questo è un esempio semplificato dei miei modelli attuali (sto usando il flacone di estensione 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'
)
Sto cercando di ordinare Post
per la quantità di Mi piace .
Questa è la query che sto fondamentalmente cercando di emettere:
.
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
Non sono stato in grado di ottenere nulla di lavorare sul lato SQLalchemy delle cose.
Grazie per qualsiasi aiuto chiunque può offrire.
Soluzione
Non ho usato lo sqlalchemy così tanto ho pensato che avrei dato un colpo.Non ho provato a usare i tuoi modelli, ne ho appena scritto alcuni nuovi (abbastanza simili):
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
.
Si desidera partecipare alla tabella likes
, utilizzare func.count
per contare Mi piace, group_by
Post
e quindi utilizzare order_by
:
db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')
.
Ho trovato il ORM Tutorial e il resto della documentazione SQLalchemy molto utile.