假设我有与标签对象有很多关系的图像对象.
现在,我正在创建一个搜索视图来显示图像,并为每个图像显示标签,显然,聪明的做法是预取图像的标签.
但是我每次只显示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(),因为它不会获取您不需要的图像.