首页 > 解决方案 > 如何在 Django 中呈现外键关系

问题描述

我有一个简单的多对一关系,用户可以在其中向轮询器对象发表评论。

评论模型

class Comments(models.Model):
    poller = models.ForeignKey(Pollers, on_delete=models.CASCADE, related_name='comments')
    created_on = models.DateTimeField(auto_now_add=True)
    comment = models.CharField(max_length=250)
    created_by = models.CharField(max_length=80)

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return 'Comment {} by {}'.format(self.body, self.name)

风景


def single_poller(request, poller_id):
    """retrieves the item clicked by the user from DB and renders
    the single_poller template for further user interaction
    """

    # Retrieve the item via get
    poller = Pollers.objects.get(poller_id=poller_id)

    # Increase the view field of the object by
    poller.poller_views += 1

    # Save the changed instance and overwrite new view integer
    poller.save()

    # Get the form for comments
    form = CommentsForm

    context = {
        'poller': poller,
        'form': form
    }
    return render(request, 'pollboard/single_poller.html', context)

现在我想像这样将每个轮询器的评论呈现到我的模板中

<div id="comments-choice-one-wrapper" class="comments-wrapper">
     {{ poller.comments.comment }}
</div>

不知何故,它不会呈现我事先创建的评论。如果评论与轮询器相关,我检查了 Django 管理员,这看起来很好。

标签: django

解决方案


poller.comments.allis a QuerySetof Comments, 所以这是一个collection,因此使用它是没有意义的,.comment因为这是一个Comment对象的属性,而不是QuerySet带有注释的属性。

您可以枚举comments.all,从而单独呈现这些注释:

<div id="comments-choice-one-wrapper" class="comments-wrapper">
    {% for comment in poller.comments.all %}
        {{ comment.comment }}
    {% endfor %}
</div>

在您的Comments模型中,使用self.nameorself.body没有多大意义,因为该模型没有name属性或字段。您可能应该__str__在以下位置使用Poller

class Comments(models.Model):
    # ⋮
    
    def __str__(self):
        return f'Comment {self.comment} by {self.poller}'

注意:通常 Django 模型被赋予一个单数名称,所以Comment而不是Comments.


推荐阅读