我如何在 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 中查询评论的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中添加对评论的回复?

Django中多表查询思路

我们如何在 Django 中删除评论之前生成确认提示?

如何在我的 Django 应用程序的“评论”视图中修复此错误?

如何在django queryset中处理变量字符串?

如何在 django 模板中显示评论及其回复?