Django query set как получить последние n записей

class Message(models.Model):
host = models.ForeignKey(NewUser, on_delete=models.CASCADE)
body = models.TextField(max_length=1000)
created = models.DateTimeField(auto_now_add=True)

class Comments(models.Model):
message = models.ForeignKey(Message, on_delete=models.CASCADE)
publisher = models.ForeignKey(NewUser, on_delete=models.CASCADE)
body = models.TextField(max_length=300)
created = models.DateTimeField(auto_now_add=True)

У меня есть приложение, в котором я хочу отобразить в шаблоне последние 5 комментариев для каждого сообщения. Как я могу получить последние n комментариев, которые соответствуют определенному сообщению? Я пробовал: comments_all = Comments.objects.all().order_by('-id')[:5], но он просто возвращает 5 последних комментариев независимо от сообщения.

<
comments = [Comments.objects.filter(message=message).order_by('-created')[:5] for message in Message.objects.all()]
Я построю список, содержащий 5 последних комментариев каждого сообщения:
def home(request):
    messages_all = Message.objects.all()

    ...

    # construct a dictionary where each message.id is the key
    # and the value is the queryset for last 5 comments for the
    # matching message
    message_last_five = {
        msg.id: Comments.objects.filter(message=msg).order_by('-created')[:5]
        for msg in messages_all
    }

    # add message_last_five to your context
    context = {
      'messages_all': messages_all,
      'comments_all': comments_all,
      'message_last_five': message_last_five,
      'form': form,
      'last_five': last_five
   }
   return render(request,'base/home.html', context)

Хотя это, возможно, даст вам то, что вам нужно - знайте, что это не оптимальное решение, потому что это довольно дорогой запрос для выполнения.

И вы также можете достичь относительно того же самого, используя шаблонизацию django.

Вернуться на верх