Django选择相关的模板分页搜索结果以减少查询?

时间:2015-08-11 22:08:53

标签: python django templates model psql

我有一个模型(产品)实际上包含许多多对多字段。

理想情况下,我试图减少对产品数量的查询 - 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)
        })

如何减少查询?最好预取与产品相关的所有数据。这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

select_related仅适用于外键。对于许多领域,您可以使用prefetch_related。我认为,如果与prefect相关,您必须指定要获取的相关模型,并且不能使用select_related之类的参数调用它。

请注意,25个产品不需要25个查询。应该可以将它减少为产品查询集的一个查询,每个prefetch_related参数的一个附加查询,以及(因为您使用的是分页符)一个用于对象总数。