所以我有两个模型: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)
答案 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
字段,并在子查询中按该字段排序。