Получение автора последнего поста - PullRequest
0 голосов
/ 04 ноября 2018

Итак, у меня есть две модели: Тема, ForumPost

С отношением многие-к-одному (в каждой теме может быть много ForumPosts).

Я хотел бы показать автора последнего сообщения, сделанного в этой теме.

Я сейчас делаю:

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

И я могу получить к нему доступ, выполнив:

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

Это работает нормально - но не делает то, что я хочу - здесь отображается только идентификатор последнего сообщения (что логично, потому что я отображаю сообщение), а не автор. Поэтому, когда я пытаюсь сделать:

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

Автор не будет отображаться (пусто), хотя у меня есть

author = models.CharField(max_length=200)

В моей модели ForumPost. Так как же продолжить отображение автора, а не идентификатора?

Модель:

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 голосов
/ 04 ноября 2018

Вам нужно выражение подзапроса .

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 обычно будет хронологическим, но это не гарантируется. Добавьте поле created_at с auto_now_add и порядок в подзапросе.

...