繁体   English   中英

SQLAlchemy Flask过滤器查询结合两个模型的结果

[英]SQLAlchemy Flask filter query to combine results from two models

我试图通过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)

如果可能的话,在构建单个查询时获得一些提示会很棒。

我想出了一个解决这个问题的方法:

thanks = Thank.query\
    .join(ThanksReceivedByUser)\
    .filter(or_(Thank.giver_id == user.id, 
                ThankReceivedByUser.receiver_id == user.id))\
    .order_by(Thank.date_registered).all()

如果我正确理解您的问题,您希望在单个查询中结合用户给出和收到的感谢。 如果是这样,你需要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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM