Как работать с отношениями "многие к одному" в 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})