如何在 Django 中处理多对一关系

How to work many to one relationship in django

你好朋友,我正在尝试弄清楚如何正确处理一对多关系。

我想创建两个模型, 第一个模型是 Post 第二个模型是 Comment

现在我说每个post有很多评论,每个评论有一个post。

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)

我想弄清楚如何获取所有 post 和所有评论,以便所有评论都与它们所属的 post 相匹配 也就是说,在视图文件中的函数中,我如何发回此选项。

因为在 HTML 页面上我想显示 post 及其所有评论 但是有很多 post,那我该怎么做呢?

我唯一能做的就是:

 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() 访问 post 的所有相关评论,请参阅 Following relationships “backward”

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

要减少查询次数,请使用 prefetch_related 在单个查询中获取所有 post 的所有相关评论

def posts_list(request):
    all_posts = Post.objects.prefetch_related('comment_set')
    return render(request, 'template.html', {'all_posts': all_posts})