成为上一篇文章的作者

时间:2018-11-04 11:27:33

标签: python django django-models

所以我有两个模型:Thread,ForumPost

具有多对一关系(每个线程可以有许多ForumPost)。

我想显示该主题发表的最新文章的作者。

我正在做:

threads = Thread.objects.annotate(replies=Count('forumpost'), lastpost=Max('forumpost'))

我可以通过以下方式访问它:

<td>{{thread.lastpost}}</td>

这可以正常工作-但它没有执行我想要的操作-仅显示最后一个帖子ID(这是合乎逻辑的,因为我正在显示帖子),而不显示作者。因此,当我尝试这样做时:

<td>{{thread.lastpost.author}}</td>

尽管我有

,但它不会显示作者(空白)。
author = models.CharField(max_length=200)

在我的ForumPost模型中。那么如何继续显示作者而不是ID?

型号:

class Thread(models.Model):
    title = models.CharField(max_length=50)

class ForumPost(models.Model):
    thread = models.ForeignKey(Thread, on_delete=models.CASCADE)
    author = models.CharField(max_length=200)
    text = models.CharField(max_length=50)

1 个答案:

答案 0 :(得分:0)

您需要一个subquery expression

newest = ForumPost.objects.filter(post=OuterRef('pk')).order_by('-pk')
threads = Thread.objects.annotate(last_post_author=Subquery(newest.values('author')[:1]))

现在,每个主题都有一个last_post_author属性,该属性的值为上一个帖子的作者。

注意,您确实应该订购一个更具体的字段-pk通常是按时间顺序排列的,但不能保证。添加一个带有auto_now_add的created_at字段,并在子查询中按该字段排序。