Flask SQLAlchemy-如何通过对ForeignKey变量的计数来排序查询结果

时间:2019-07-02 15:43:05

标签: python sqlalchemy

我正在使用Flask-SQLAlchemy实现博客帖子类型的Flask应用程序。

我正在尝试根据收到的每个博客帖子的喜欢总数对博客帖子进行排序。我已经尝试将SQLALchemy混合属性与查询session.query(Post).order_by(Post.likes_count.desc()).all()一起使用,这类似于先前here提出的问题的解决方案

它引发错误AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Post.likes has an attribute 'count'

有没有一种方法可以使用喜欢计数来获取帖子订单,需要将其馈入分页功能。

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20))
    email = db.Column(db.String(120))
    likes = db.relationship('Like', backref='user',lazy='dynamic',foreign_keys='Like.user_id')
    def __repr__(self):
        return f"User('{self.username}', '{self.email}')"

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    date_posted = db.Column(db.DateTime, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    likes = db.relationship('Like', backref='post', lazy='dynamic')

    @hybrid_property
    def likes_count(self):
        return self.likes.count()

    def __repr__(self):
        return f"Post('{self.title}', '{self.date_posted}')"

class Like(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))

此问题类似于How to order by count of many-to-many relationship in SQLAlchemy?,但是我无法使用答案/评论中提到的lencount()方法获得查询结果。

1 个答案:

答案 0 :(得分:1)

我要做的方法是使用sqlalchemy的func functionality,它只是镜像SQL函数。在这种情况下,很可能是以下情况:

from sqlalchemy import func

session.query(Post).join(Like).group_by(Post.id).order_by(func.count().desc()).all()

此查询产生类似于以下原始SQL的内容(尽管我只是尝试通过不写所有内容来使其更简洁):

SELECT post.*
FROM post
JOIN like ON like.post_id = post.id
GROUP BY post.id
ORDER BY count() desc

希望这会有所帮助!