您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

遍历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 %}
Go 2022/1/1 18:29:13 有420人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶