2つの別々のテーブルの結果をマージして最大値を取得しようとしています。投稿の最新のコメントを取得しようとしています。Comment
からアクセスできるモデルがありますPost.comments
。Post
からアクセスできるとは別のボディもありますPost.body
。コメントと本文の両方に、であるフィールドwhen
がありDateTimeField
ます。最新のコメントまたは本文を含む投稿が最初に表示されるように、最新のアクティビティでソートされたクエリセットを返したいと思います。
モデルが次のようになっていると仮定します。
class Body(models.Model):
when = models.DateTimeField(default=datetime.datetime.now)
class Post(models.Model):
body = models.ForeignKey(Body)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments')
when = models.DateTimeField(default=datetime.datetime.now)
結果を処理し続け、さらに結果を制限するためにページネーターに渡すので、可能であれば結果をクエリセットのままにしておきたいと思います。
基本的に、私は電話できるようにしたいと思います:
q = Post.annotate(
activity=Max(
Union('comments__when', 'body__when')
)
)
q = q.order_by('-activity')
しかし、私はその連合を達成する方法を知りません。
私が探しているものを実現するSQLは、次のものに匹敵すると思います。
SELECT
...
IF(MAX(c.`when`), MAX(c.`when`), b.`when`) AS `activity`
...
FROM `post` p
...
LEFT OUTER JOIN `comment` AS c
ON c.`post_id`=p.`id`
LEFT OUTER JOIN `body` AS b
ON p.`body_id`=b.`id`
...
このようなカスタマイズされた注釈と結合を実行できますか?