我有一个模型(产品)实际上包含许多多对多字段。
理想情况下,我试图减少对产品数量的查询 - 25,但考虑到外键和m2ms的深度,我理解这可能是不可能的。但是我仍在拍摄以获得最佳效果。
以下是我的观点:
def index(request):
products = Product.objects.select_related()
paginator = Paginator(products, 25)
page = request.GET.get('page')
try:
products = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
products = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
products = paginator.page(paginator.num_pages)
print (len(connection.queries))
return render(request, 'editor-index.html', {
'products': products,
'connection':connection,
'csrf':csrf(request)
})
如何减少查询?最好预取与产品相关的所有数据。这样的事情可能吗?
答案 0 :(得分:1)
select_related
仅适用于外键。对于许多领域,您可以使用prefetch_related
。我认为,如果与prefect相关,您必须指定要获取的相关模型,并且不能使用select_related
之类的参数调用它。
请注意,25个产品不需要25个查询。应该可以将它减少为产品查询集的一个查询,每个prefetch_related
参数的一个附加查询,以及(因为您使用的是分页符)一个用于对象总数。