如何获取可以在 Django 中迭代的 ManyToManyField 相关查询集?
How to get an ManyToManyField related queryset that can be iterated in Django?
假设我的 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>
显然,这是行不通的。但是,它让您了解我正在尝试做什么,即获取特定评论的标签并显示它们。如何使用我当前的设置执行此操作?
谢谢。
我完全重写了答案,因为它获得了赞成票和 'accepted answer',但最初它是错误的。
所以正确的答案是调用 {% for tag in review.tags.all %}
循环遍历与 Review
对象相关的所有 Tag
对象。
加法:如果你想先遍历Tag
对象,然后遍历与Tag
有关系的Review
对象,那么您需要查看 returns Tag
个对象。
def index(request):
tags = Tag.objects.all()
return render(request, 'index.html', {'tags': tags})
并且在模板中您需要使用 ManyToManyField
中的 related_name
进行迭代
{% for tag in tags %}
<p>{{tag.name}}</p>
{% for review in tag.review_tags.all %}
{{ review.text }}
{% endfor %}
{% endfor %}
假设我的 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>
显然,这是行不通的。但是,它让您了解我正在尝试做什么,即获取特定评论的标签并显示它们。如何使用我当前的设置执行此操作?
谢谢。
我完全重写了答案,因为它获得了赞成票和 'accepted answer',但最初它是错误的。
所以正确的答案是调用 {% for tag in review.tags.all %}
循环遍历与 Review
对象相关的所有 Tag
对象。
加法:如果你想先遍历Tag
对象,然后遍历与Tag
有关系的Review
对象,那么您需要查看 returns Tag
个对象。
def index(request):
tags = Tag.objects.all()
return render(request, 'index.html', {'tags': tags})
并且在模板中您需要使用 ManyToManyField
related_name
进行迭代
{% for tag in tags %}
<p>{{tag.name}}</p>
{% for review in tag.review_tags.all %}
{{ review.text }}
{% endfor %}
{% endfor %}