Как работать с отношениями "многие к одному" в django

Здравствуйте друзья, я пытаюсь понять, как правильно работать с отношениями "один ко многим".

Я хочу создать две модели, Первая модель - Post И вторая модель - Comment

Теперь я говорю, что у каждого поста много комментариев, а у каждого комментария - один пост.

class Post(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  title = models.CharField(max_length=50)
  message = models.TextField(max_length=256,null=True)
  
  def __str__(self):
    return str(self.title)

class Comment(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  post = models.ForeignKey(Post, on_delete=models.CASCADE)
  message = models.TextField(max_length=256, null=True)

Я пытаюсь понять, как я могу получить все посты и все комментарии, чтобы все комментарии соответствовали посту, к которому они относятся. То есть, в функциях в файле views как мне отправить обратно эту опцию.

Потому что на HTML странице я хочу отобразить пост со всеми комментариями. но есть несколько постов, как мне это сделать?

Единственная мысль, которую я могу высказать, такова:

 dict = {}
 all_posts = Post.objects.all()
    for post in all_posts:
      dict[post] = Comment.objects.filter(post=post).values()
    print(dict)

но у меня есть чувство, что есть что-то лучше

Вы можете получить доступ ко всем связанным комментариям для сообщения, используя post.comment_set.all() см. Следующие отношения "назад"

{% for post in all_posts %}
    {{ post }}
    {% for comment in post.comment_set.all %}
        {{ comment }}
    {% endfor %}
{% endfor %}

Для уменьшения количества запросов используйте prefetch_related для получения всех связанных комментариев для всех постов по одному запросу

def posts_list(request):
    all_posts = Post.objects.prefetch_related('comment_set')
    return render(request, 'template.html', {'all_posts': all_posts})
Вернуться на верх