我如何限制Django中的prefetch_related?

假设我有与标签对象有很多关系的图像对象.

现在,我正在创建一个搜索视图来显示图像,并为每个图像显示标签,显然,聪明的做法是预取图像的标签.

但是我每次只显示15个图像,但我必须评估整个查询集,以便显示总体上有多少结果.
所以我需要只为前15个元素预取标签

如果我在切片前预取标签:

images = watson.filter(queryset, query).prefetch_related('tags')
amount = images.count()
images = images[:15]

这是非常糟糕的,因为可能有数千个结果,每个结果可以有很多标签.

但如果我先切片:

images = watson.filter(queryset, query).prefetch_related('tags')[:15]
amount = images.count()

现在我只预取15个结果的标签,这是好的,但我不能计算结果而不进行另一个查询.

如果我这样做:

images = watson.filter(queryset, query)
amount = len(images)
images = images.prefetch_related('tags')[:15]

我仍然最终访问数据库两次,因为prefetch执行新的数据库查询.

基本上我需要一次点击数据库来获取所有图像,但只预取前15个标签.

最佳答案 尝试先调用count(),然后执行prefetch_related()并对查询集进行切片.

images = watson.filter(queryset, query)
amount = images.count()
images = images.prefetch_related('tags')[:15]

这将对计数执行一次查询,一次查询前15个图像,另一个查询预览标记.调用count()优于len(),因为它不会获取您不需要的图像.

点赞