#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
.