我正在尝试通过date_registered订阅用户的感谢(帖子)。
目前,有两个查询可以获得两个列表,然后手动组合并重新排序。用户可以是感谢者或接收者。感谢总是一个单独的给予者,但可能有多个接收者。因此,我有一个Thank和一个ThankReceivedByUser模型来实现结果。
class Thank(db.Model):
id = db.Column(db.Integer, primary_key = True)
giver_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable = False)
status = db.Column(db.SmallInteger, nullable = False)
date_registered = db.Column(db.DateTime, nullable = False)
class ThankReceivedByUser(db.Model):
id = db.Column(db.Integer, primary_key = True)
thank_id = db.Column(db.Integer, db.ForeignKey("thank.id"), nullable = False)
receiver_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable = False)
status = db.Column(db.SmallInteger, nullable = False)
date_registered = db.Column(db.DateTime, nullable = False)
如果可能的话,在构建单个查询时获得一些提示会很棒。
答案 0 :(得分:7)
我找到了解决这个问题的方法:
thanks = Thank.query\ .join(ThanksReceivedByUser)\ .filter(or_(Thank.giver_id == user.id, ThankReceivedByUser.receiver_id == user.id))\ .order_by(Thank.date_registered).all()
答案 1 :(得分:6)
如果我正确理解您的问题,您希望在单个查询中结合用户给出和收到的感谢。如果是这样,您需要UNION
两个查询,其中一个选择感谢,而另一个查询。然后,您可以订购此组合查询的结果。以下是您的查询的样子:
# user_id contains a value of some user's id.
given_q = db.session.query(Thank).filter_by(giver_id=user_id)
received_q = db.session.query(Thank).join(ThankReceivedByUser).\
filter(ThankReceivedByUser.receiver_id == user_id)
q = given_q.union(received_q).order_by(Thank.date_registered)