Python sqlalchemy查询:获取按喜欢和评论数量排序的帖子列表
我正在尝试创建一个GETAPI返回的帖子列表,它应该按照喜欢和评论的数量排序,包括没有评论或喜欢的帖子。我被这个问题难住了。如果将其分解为如下子查询 queryset 我得到了大多数评论帖子的排序列表,但它跳过了没有评论的帖子 下面是我的型号Python sqlalchemy查询:获取按喜欢和评论数量排序的帖子列表,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我正在尝试创建一个GETAPI返回的帖子列表,它应该按照喜欢和评论的数量排序,包括没有评论或喜欢的帖子。我被这个问题难住了。如果将其分解为如下子查询 queryset 我得到了大多数评论帖子的排序列表,但它跳过了没有评论的帖子 下面是我的型号 型号 提前感谢:)听起来你需要使用.outerjoin(注释) 默认情况下,JOIN语句执行一个internaljoin,它将删除任何缺少的行。如果执行外部联接,缺少的行将被空值“填充” week = datetime.timedelta(7) toda
型号
提前感谢:)听起来你需要使用
.outerjoin(注释)
默认情况下,JOIN
语句执行一个internaljoin
,它将删除任何缺少的行。如果执行外部联接
,缺少的行将被空值“填充”
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"))