запрос sqlalchemy: получить список сообщений, упорядоченных по количеству лайков и комментариев

#python #flask #sqlalchemy #flask-sqlalchemy

#python #flask #sql — алхимия #flask-sqlalchemy #sqlalchemy

Вопрос:

Я пытаюсь создать get API, который возвращает список сообщений, которые должны быть упорядочены по количеству лайков и комментариев, включая сообщения без комментариев или лайков. Я застрял в запросе. Если разбить его на подзапрос, как показано ниже

набор запросов

 week  = datetime.timedelta(7)
today = datetime.date.today()
most_commented_posts = db.session.query(Post).join(Comment).group_by(Post.id).order_by(func.count().desc()).filter(Post.created_at>=(today-week)).all()
  

Я получаю список сообщений, упорядоченных по большинству прокомментированных сообщений, но он пропускает сообщения без комментариев

Ниже приведена моя модель
Модель

 class Base(db.Model):
    __abstract__ = True

    created_at = db.Column(db.DateTime, default=db.func.now())
    updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())

class Post(Base):
    __tablename__ = 'post'

    id               = db.Column(db.Integer, primary_key=True)
    title            = db.Column(db.String(255))
    discription      = db.Column(db.String)
    image            = db.Column(db.String)
    user_id          = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade"))
    comments         = db.relationship('Comment', backref='post', lazy='dynamic')
    Likes            = db.relationship('PostLikes', backref='post', lazy='dynamic')  
    user             = db.relationship('User', backref='user', lazy=True)

class Comment(Base):
    __tablename__ = 'comment'

    id               = db.Column(db.Integer, primary_key=True)
    text             = db.Column(db.String)
    user_id          = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade"))
    post_id          = db.Column(db.Integer, db.ForeignKey("post.id", ondelete="cascade"))
    user             = db.relationship('User', backref='comment', lazy=True)

class PostLikes(Base):
    __tablename__ = 'post_likes'

    id               = db.Column(db.Integer, primary_key=True)
    post_id          = db.Column(db.Integer, db.ForeignKey("post.id", ondelete="cascade"))
    user_id          = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade"))
  

Заранее спасибо 🙂

Ответ №1:

Похоже, вам нужно использовать .outerjoin(Comment)

По умолчанию JOIN оператор выполняет INNER JOIN , который не учитывает все пропущенные строки. Если вы выполните OUTER JOIN недостающие строки, они будут «заполнены» NULLs .