你现在正在做的方法将是 低效的,因为这将导致1 + N号查询。也就是说,对于所有新闻通讯的查询为1,然后对于每次评估这些n.article_set.all()
结果的查询为1 。因此,如果在该第一个查询中有100个Newletter对象,则将进行101个查询。
这是使用的绝佳理由prefetch_related
。它只会导致2个查询。一个可以获取新闻通讯,一个可以批量获取相关文章。尽管您仍然可以继续进行zip
整理以组织它们,但它们已经被缓存了,因此您实际上可以直接将查询直接传递到模板并在其上循环。:
newsletters = Newsletter.objects.prefetch_related('article_set').all()\
.order_by('-year', '-number')
return render_to_response('newsletter/newsletter_list.html',
{'newsletter_list': newsletters})
{% block content %}
{% for newsletter in newsletter_list %}
<h2>{{ newsletter.label }}</h2>
<p>Volume {{ newsletter.volume }}, Number {{ newsletter.number }}</p>
<p>{{ newsletter.article }}</p>
<ul>
{% for a in newsletter.article_set.all %}
<li>{{ a.title }}</li>
{% endfor %}
</ul>
{% endfor %}
{% endblock %}