【问题标题】:How do i query for comment in Django我如何在 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 %}

【问题讨论】:

    标签: python django django-queryset


    【解决方案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(...)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2022-08-21
    相关资源
    最近更新 更多