我如何在 Django 中查询评论
Posted
技术标签:
【中文标题】我如何在 Django 中查询评论【英文标题】:How do i query for comment in Django 【发布时间】:2020-09-04 10:43:13 【问题描述】:我是 Django 的新手,我一直在关注在线教程。我在如何显示 cmets 时遇到问题。 如何在视图中查询 cmets,以便显示特定帖子的 cmets。
型号:
class Post(models.Model):
poster_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, blank=True,null=True)
image_caption = models.TextField(blank=True, null=True)
class Comments (models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, blank=True,null=True)
commented_image = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
comment_post = models.TextField()
Views.py:
def home_view(request):
comment = Comments.objects.all() #This is getting all comment in all post, how do i query for comment in a particular post.
context'comment':comment
return render(...)
模板:
% for com in comment %
<p> com.comment_post </p>
% endfor %
【问题讨论】:
【参考方案1】:你可以的
post = Post.objects.get(id=1)
comment = post.comments_set.all()
Following Relationships "Backward"
如果模型具有 ForeignKey,则外键模型的实例将有权访问返回第一个模型的所有实例的 Manager。默认情况下,这个 Manager 被命名为 FOO_set,其中 FOO 是源模型名称,小写。此管理器返回 QuerySet,可以按照上面“检索对象”部分的说明进行过滤和操作。
请注意,此行为可以被覆盖。
您可以通过在 ForeignKey 定义中设置 related_name 参数来覆盖 FOO_set 名称。例如,如果 Entry 模型更改为 blog = ForeignKey(Blog, on_delete=models.CASCADE,related_name='entries'),上面的示例代码将如下所示:
编辑#2:
views.py:
def home_view(request):
posts = Post.objects.all().reverse()[5]
context 'posts': posts,
return render(...)
现在您可以在模板中执行以下操作:
% if posts %
% for post in posts %
post.image_caption
% for comment in post.comments_set.all %
comment.comment_post
% endfor %
% endfor %
% endif %
【讨论】:
我收到一个错误,帖子匹配查询不存在。 我遇到了同样的错误,它指向 post = Post.objects.get(id=1) N+1 问题呢? 检查 Post 模型,它没有和 id 字段。 @Hisham.. 同样的错误,帖子匹配查询不存在【参考方案2】:def home_view(request):
particular_Post= Post.objects.get(id=1)
comment = Comments.objects.get(Post=particular_Post)
context'comment':comment
return render(...)
为了理解 django 中的查询,我建议你从
开始python manage.py shell
然后导入你的模型
【讨论】:
@Zouhair...谢谢,但这不能回答我的问题【参考方案3】:首先,查看 Django 查询集文档,尤其是针对此类问题的 select_related(以减少对数据库的查询次数)。我没有尝试,但遵循 sn-p 必须有效。
class Post(models.Model):
poster_profile = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
image_caption = models.TextField(blank=True, null=True)
class Comments (models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
commented_image = models.ForeignKey(Post, related_nam="comments", on_delete=models.CASCADE)
comment_post = models.TextField()
...
def home_view(request):
post = Post.objects.filter(id=request.data.get('post_id')).select_related("comments") # specify the post anyhow ..
comments = post.comments
context'comment': comments
return render(...)
【讨论】:
@ilhnctn...我收到一个错误 WSGIRequest 对象没有属性数据 你能试试request.body
吗?
***.com/questions/29780060/…以上是关于我如何在 Django 中查询评论的主要内容,如果未能解决你的问题,请参考以下文章