Сортировать родительскую модель по нескольким дочерним свойствам SQLAlchemy - PullRequest
1 голос
/ 25 апреля 2020

Я использую Python / Flask / SQLAlchemy. У меня есть класс Contest, который я хочу отсортировать по рейтингу, который (сложно) является суммой его дочерних (боковых) свойств. Формула для рейтинга:

leftside.score + len(leftside.votes) + rightside.score + len(leftside.votes)

Модели:

class Contest(db.Model):
    leftside_id = db.Column(db.Text, db.ForeignKey('sides.id'))
    rightside_id = db.Column(db.Text, db.ForeignKey('sides.id'))

    leftside = db.relationship("Side", foreign_keys=[leftside_id])
    rightside = db.relationship("Side", foreign_keys=[rightside_id])

    rating = #??? leftside.score + len(leftside.votes) + rightside.score + len(leftside.votes)


class Side(db.Model):
    score = db.Column(db.Integer, default=0)
    votes = db.relationship('SideVote')

class SideVote(db.Model):
    side_id = db.Column(db.Text, db.ForeignKey('sides.id'))
    side = db.relationship('Side')

Я могу написать необработанный SQL, но он вернет простой список, но мне нужен запрос SQLAlchemy

SELECT *, (
    score
        + (SELECT COUNT(*) FROM sidevotes WHERE side_id = contests.leftside_id or side_id = contests.rightside_id)
    ) as Field
FROM contests, sides
WHERE contests.leftside_id = sides.id or contests.rightside_id = sides.id
ORDER BY Field DESC

Итак, еще раз, мне нужно отсортировать конкурсы по формуле, написанной выше, здесь я вижу 2 возможных решения:

  • Либо создайте некое поле hybrid_property / column_property

  • Или выполните SQL и сопоставьте его с запросом SQLAlchemy, чтобы я мог использовать эти результаты

...