【发布时间】:2012-06-03 14:41:23
【问题描述】:
我试图通过合并两个单独表的结果来获得最大值。我正在尝试获取帖子的最新评论。我有一个模型Comment,可以通过Post.comments 访问。我还有一个与Post 分开的主体,Post.body 可以访问它。 cmets 和 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可以实现吗?
【问题讨论】:
标签: django join merge union annotate