假设我有与标记对象有多个关系的图像对象。
现在,我正在创建一个搜索视图来显示图像,并为每个图像显示标记,显然,明智的做法是为图像预取标记。
然而,我每次只显示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]我仍然两次访问数据库,因为预取会执行一个新的db查询。
--基本上我需要点击数据库一次才能得到所有的图像,但只需预取前15个的标记。
发布于 2015-10-06 13:33:08
尝试先调用count(),然后执行prefetch_related()并切片查询集。
images = watson.filter(queryset, query)
amount = images.count()
images = images.prefetch_related('tags')[:15]这将对计数执行一个查询,对前15个图像执行一个查询,并为预取标记执行一个查询。调用count()比len()更好,因为它不会获取您不需要的图像。
https://stackoverflow.com/questions/32971146
复制相似问题