Flask SQLAlchemy - Как упорядочить результат запроса по количеству переменных ForeignKey - PullRequest
0 голосов
/ 02 июля 2019

Я использую Flask-SQLAlchemy для создания блоговых сообщений.

Я пытаюсь упорядочить записи блога на основе общего количества лайков, полученных каждым постом в блоге.Я попытался использовать гибридное свойство 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'))

Этот вопрос похож на Как упорядочить по количеству отношений многие ко многим в SQLAlchemy? Однако мне не удалось получить результаты запроса с помощью метода len или count(), упомянутого в ответе / комментарии.

1 Ответ

1 голос
/ 02 июля 2019

Я бы сделал это, используя func функциональность sqlalchemy , которая просто отражает функцию 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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...