Flask SQLAlchemy - 如何通过外键变量的计数对查询结果进行排序

L.f*_*ole 4 python sqlalchemy

我正在使用 Flask-SQLAlchemy 实现博客文章类型 Flask 应用程序。

我正在尝试根据每篇博客文章收到的点赞总数对博客文章进行排序。我尝试过将 SQLALchemy 混合属性与查询一起使用,session.query(Post).order_by(Post.likes_count.desc()).all()这类似于此处先前提出的问题的解决方案

它抛出错误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'))
Run Code Online (Sandbox Code Playgroud)

这个问题类似于如何在 SQLAlchemy 中按多对多关系的计数进行排序?但是,我无法使用答案/评论中提到的方法获取查询len结果count()

Rub*_*oot 5

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

from sqlalchemy import func

session.query(Post).join(Like).group_by(Post.id).order_by(func.count().desc()).all()
Run Code Online (Sandbox Code Playgroud)

这个查询的结果类似于下面的原始 SQL(尽管我只是试图通过不写出所有内容来使其更简洁):

SELECT post.*
FROM post
JOIN like ON like.post_id = post.id
GROUP BY post.id
ORDER BY count() desc
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!