簡體   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