selected_related与prefetch_related方法的使用
详细讲解了django相关的性能优化:https://mp.weixin.qq.com/s/U07oOF8t04H8jyNv0TMJFw
假设我们有一个文章(Article)模型,其与类别(Category)是单对多的关系(ForeignKey), 与标签(Tag)是多对多的关系(ManyToMany)。
我们需要编写一个article_list的函数视图,以列表形式显示文章清单及每篇文章的类别和标签,你的模板文件可能如下所示
#在模板里每进行一次for循环获取关联对象category和tag的信息,Django就要单独进行一次数据库查询,造成了极大资源浪费。如何进行解决呢?
{% for article in articles %}
<li>{{ article.title }} </li>
<li>{{ article.category.name }}</li>
<li>
{% for tag in article.tags.all %}
{{ tag.name }},
{% endfor %}
</li>
{% endfor %}
select_related方法用来(查询一对多关系)和prefetch_related方法(查询多对多关系)一次性从数据库获取单对多和多对多关联模型数据,
这样在模板中遍历时Django也不会执行数据库查询了。
# 仅获取文章数据 - Bad
def article_list(request):
articles = Article.objects.all()
return render(request, 'blog/article_list.html',{'articles': articles, })
# 一次性提取关联模型数据 - Good
def article_list(request):
articles = Article.objects.all().select_related('category').prefecth_related('tags')
return render(request, 'blog/article_list.html', {'articles': articles, })