如何在 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})
你好朋友,我正在尝试弄清楚如何正确处理一对多关系。
我想创建两个模型, 第一个模型是 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})