遍历Django中的相关对象:遍历查询集或使用单行select_related(或prefetch_related)

遍历Django中的相关对象:遍历查询集或使用单行select_related(或prefetch_related),第1张

遍历Django中的相关对象:遍历查询集或使用单行select_related(或prefetch_related)

你现在正在做的方法将是 严重 低效的,因为这将导致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 %}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5647941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存