我试图通过合并两个单独表的结果来获得最大值。我正在尝试获取帖子的最新评论。我有一个模型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`
...
这样的自定义注解和Join可以实现吗?