如何获取可以在Django中迭代的ManyToManyField相关查询集?

时间:2016-03-03 08:33:53

标签: python django django-models django-queryset

假设我的 models.py 如下所示:

class Tag(models.Model):
    name = models.CharField(max_length=50)

class Review(models.Model):
    text = models.TextField()
    tags = models.ManyToManyField(Tag, related_name='review_tags', blank=True)

在我的 views.py 中,我收到了这样的查询集:

def index(request):
    reviews = Review.objects.all()
    return render(request, 'myapp/index.html', {'reviews' : reviews})

现在在 index.html 中,我正在执行以下操作:

<div>
    {% for review in reviews %}
        <p>{{review.text}}</p>
        {% for tag in review.tags %}
            {{tag.name}}
        {% endfor %}
    {% endfor %}
</div>

显然,这不起作用。但是,它会让您了解我要做的事情,即获取特定评论的标签并显示它们。如何使用我当前的设置执行此操作?

谢谢。

1 个答案:

答案 0 :(得分:4)

我完全重写了答案,因为它获得了回报并且接受了答案,但最初它是错误的。

所以正确的答案是调用{% for tag in review.tags.all %}来遍历与循环中Tag对象相关的所有Review个对象。

Adition :如果您想首先迭代Tag个对象,然后遍历与Review有关系的Tag个对象,那么您需要查看,返回Tag个对象。

def index(request):
    tags = Tag.objects.all()
    return render(request, 'index.html', {'tags': tags})

在模板中,您需要使用related_name

中的ManyToManyField进行迭代
{% for tag in tags %}
    <p>{{tag.name}}</p>
    {% for review in tag.review_tags.all %}
        {{ review.text }}
    {% endfor %}
{% endfor %}