4

date_registered でユーザーの感謝 (投稿) を注文しようとしています。

現時点では、2 つのリストを取得し、手動で結合して並べ替える 2 つのクエリがあります。ユーザーは、感謝の贈り主または受け取り手になることができます。感謝の贈り主は常に 1 人ですが、受け取る人は複数になる場合があります。したがって、結果を達成するための 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)

可能であれば、単一のクエリを作成するためのヒントを得ることができれば幸いです。

4

2 に答える 2

8

この問題の解決策を思いつきました:

Thanks = Thank.query\
    .join(ThanksReceivedByUser)\
    .filter(or_(Thank.giver_id == user.id,
                ThankReceivedByUser.receiver_id == user.id))\
    .order_by(Thank.date_registered).all()
于 2013-03-07T13:33:49.673 に答える
7

私があなたの質問を正しく理解できれば、ユーザーからの感謝と受け取った感謝を 1 つのクエリにまとめることができます。その場合、UNION2 つのクエリが必要です。そのうちの 1 つは与えられた感謝を選択し、もう 1 つは受け取った感謝を選択します。次に、この結合されたクエリの結果を並べ替えることができます。クエリは次のようになります。

# 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)
于 2013-03-07T10:22:19.250 に答える