简体   繁体   English

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

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

I am trying to order a user's thanks(posts) by date_registered. 我试图通过date_registered订购用户的感谢(帖子)。

At the moment, there are two queries to get two lists, then manually combine and re-order. 目前,有两个查询可以获得两个列表,然后手动组合并重新排序。 A user can be a giver of thank or a receiver. 用户可以是感谢者或接收者。 A thank has always a single giver, however might have multiple receivers. 感谢总是一个单独的给予者,但可能有多个接收者。 Therefore I have a Thank and a ThankReceivedByUser models to achive results. 因此我有一个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)

It would be great to get some hints on constructing a single query if possible. 如果可能的话,在构建单个查询时获得一些提示会很棒。

I came up with a solution to this problem: 我想出了一个解决这个问题的方法:

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

If I understand your question correctly, you want to combine thanks given and received by a user in a single query. 如果我正确理解您的问题,您希望在单个查询中结合用户给出和收到的感谢。 If so, you need to UNION two queries, one of which selects given thanks, while another received ones. 如果是这样,你需要UNION两个查询,其中一个选择给予感谢,而另一个选择。 Then you can order the results of this combined query. 然后,您可以订购此组合查询的结果。 Here's how your query would look like: 以下是您的查询的外观:

# 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