SQLAlchemy Flask 过滤器查询以组合来自两个模型的结果

Posted

技术标签:

【中文标题】SQLAlchemy Flask 过滤器查询以组合来自两个模型的结果【英文标题】:SQLAlchemy Flask filter query to combine results from two models 【发布时间】:2013-03-06 13:55:32 【问题描述】:

我正在尝试按 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)

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

【问题讨论】:

您指的是哪两个列表:给予感谢的列表和收到的感谢列表? 【参考方案1】:

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

谢谢=Thank.query\ .join(ThanksReceivedByUser)\ .filter(or_(Thank.giver_id == user.id, 感谢ReceivedByUser.receiver_id == user.id))\ .order_by(Thank.date_registered).all()

【讨论】:

【参考方案2】:

如果我正确理解了您的问题,您希望将用户给予和接受的感谢合并到一个查询中。如果是这样,您需要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)

【讨论】:

以上是关于SQLAlchemy Flask 过滤器查询以组合来自两个模型的结果的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SQLAlchemy 左外连接过滤查询

Flask--SQLAlchemy--基本查询备忘

从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]

Flask SQLAlchemy查询:从自己的外键关系中过滤记录

Flask框架从入门到精通之模型查询(十三)

Flask框架从入门到精通之模型查询(十三)