Как правильно составить запрос на сортировку flask sqlalchemy?

Имеется Модель, связанная отноешнием один к многим с другой моделью. Статья и комментарии Article.query.first().comments - вернет InstrumentedList, имеющий доступ к len() Нужно составить Article.query.order_by() с аргументом таким, чтоб получить последовательность отсортированную по кол-ву комментариев к статье. Помогите пожалуйста, заранее спасибо!

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(128), nullable=False)
    cut = db.Column(db.String(128), nullable=False)
    text = db.Column(db.Text, nullable=False)
    date = db.Column(db.DateTime, nullable=False, 
        default=datetime.utcnow())

    owner_id = db.Column(db.Integer, db.ForeignKey('user.id'),
        nullable=False)
    owner = db.relationship('User', backref=db.backref('owner', lazy=True))



    tags = db.relationship('Tag', secondary=tags, lazy='subquery',
        backref=db.backref('articles', lazy=True))

    comments = db.relationship('Comment', lazy=True,
        backref=db.backref('comments', lazy=True))

    def __repr__(self):
        return '<Article %r>' % self.id    


class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.Text, nullable=False)
    date = db.Column(db.DateTime, nullable=False, 
        default=datetime.utcnow())

    owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    owner = db.relationship('User', backref=db.backref('creater', lazy=True))

    article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
    article = db.relationship('Article', backref=db.backref('article', lazy=True))

    def __repr__(self):
        return '<Comment %r' % self.id

Ответы (1 шт):

Автор решения: Alexander Goryushkin

Используйте join комментариев совместно c группировкой по Article.id, в качестве агрегатной функции для комментариев будет count - по получившемуся значению сортируются статьи.
Вы также можете изменить порядок сортировки поменяв .asc() на .desc().

from sqlalchemy import func

...

Article.query.outerjoin(Comment).group_by(Article.id).order_by(func.count(Comment.id).asc()).all()
→ Ссылка