如何在Django queryset的extra()方法中从另一个表中选择相关的行

时间:2015-11-09 19:38:49

标签: python sql django postgresql django-queryset

我有两个简单的模型:

class Blog(models.Model):
    text = models.Textfield()
    writer = models.Foreignkey(User)
    date = models.DateTimeField(auto_now_add=True)

class Comment(models.Model):
    body = models.Textfield()
    submitted_by = models.Foreignkey(User)
    which_blog = models.Foreignkey(Blog)
    date = models.DateTimeField(auto_now_add=True)

基本上,用户可以提交博客对象,其他用户可以在所述博客对象下留下评论。

接下来,我想在每个博客对象中附加最新评论的时间戳。请注意,我不想在整个评论表中附加全局最大时间戳 - 而只是将所有评论中包含所述博客对象作为外键的最新时间。即对于没有任何评论的博客,不会附加任何内容。

我无法针对上述内容制定查询。这是我正在尝试的内容:

blog_qset = Blog.objects.extra(select={'date':"SELECT max(date) FROM appname_comment WHERE appname_comment.which_blog_id=%s"},select_params=(blog.id,),)

这只是将全局最大时间戳附加到每个博客对象,而不是仅从评论表的相关行中查找max 。请按照我在上面的大段落中描述的要求帮助我清理extra()中的SQL查询。

注意:由于本问题范围之外的原因,我无法使用annotate()来完成此任务。

1 个答案:

答案 0 :(得分:0)

尝试:

blog_qset = Blog.objects.extra(select={'date':"SELECT max(date) FROM appname_comment WHERE appname_comment.which_blog_id=%s"},select_params=(blog.id,),)