你现在正在做的方法将是 严重 低效的,因为这将导致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 %}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)