sqlalchemy query:获取第ordered_by个帖子列表。喜欢和评论

时间:2020-09-14 18:28:03

标签: python flask sqlalchemy flask-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 个答案:

答案 0 :(得分:0)

听起来像您需要使用.outerjoin(Comment)

默认情况下,JOIN语句执行INNER JOIN,从而省略所有丢失的行。如果您执行OUTER JOIN,则缺少的行将被NULLs“填充”。

相关问题