📅  最后修改于: 2023-12-03 15:14:43.721000             🧑  作者: Mango
在 Django 中,我们经常需要在一张表格中查询出其他表格的相关信息,例如查询出所有文章的评论,查询出指定用户发布的所有文章等等。为了优化这种查询的性能,Django 提供了两个函数 Prefetch_related 和 select_related。
select_related 用于优化一对多的查询,即在从表中查询主表的相关信息。例如,在查询文章时需要查询出文章的作者,可以使用 select_related 来避免进行多次查询。
语法
queryset.select_related([related_name])
示例
from django.shortcuts import render
from django.db.models import Q
from .models import Article
def search(request):
keyword = request.GET.get('keyword')
articles = Article.objects.filter(
Q(title__icontains=keyword) | Q(content__icontains=keyword)
).select_related('author')
return render(request, 'search.html', {'articles': articles})
上面的例子中我们使用了 select_related 来查询出文章对应的作者,避免了进行多次查询。
Prefetch_related 用于优化多对多和反向查询,即对于一个表格和多张关联表格进行查询。例如,在查询文章时需要查询出所有标签,可以使用 Prefetch_related 来避免进行多次查询。
语法
queryset.prefetch_related(
Prefetch('related_model', queryset=RelatedModel.objects.filter(...), to_attr='related_attr')
)
示例
from django.shortcuts import render
from django.db.models import Q, Prefetch
from .models import Article
def search(request):
keyword = request.GET.get('keyword')
articles = Article.objects.filter(
Q(title__icontains=keyword) | Q(content__icontains=keyword)
).prefetch_related(Prefetch('tags'))
return render(request, 'search.html', {'articles': articles})
上面的例子中我们使用了 Prefetch_related 来查询出所有标签,避免了进行多次查询。
通过使用 select_related 和 Prefetch_related,我们可以极大地优化数据库查询的性能。在进行查询优化时,我们要根据实际情况进行选择使用哪种查询方式。