获取许多对象,但只能预取Django中的前20个

时间:2015-10-20 05:44:22

标签: django postgresql django-models django-orm

我想知道我是否可以在一个SQL查询中想要我想要的,目前我的数据库在服务器中运行缓慢,我试图尽可能地减少查询。

我需要查询3件事:

  • 获取与我的过滤器匹配的前20个对象
  • 预取相关对象(m2m)仅适用于前20个
  • 计算与我的过滤器匹配的所有对象

到目前为止,我只找到了在2个查询中执行此操作的方法,因为我似乎无法限制预取而不会限制整个查询。

这是我的代码:

images = Image.objects.filter().order_by('-id').distinct().prefetch_related('tags')[:20]
amount = images.count()

这导致2个数据库查询,我该如何制作这个?

1 个答案:

答案 0 :(得分:0)

以上陈述不是2个数据库查询。 Prefetch_related将生成与每个图像的m2m关系一样多的数据库查询。 所以基本上是1 + total_number_of_tags_of_queryset_images

如果您不提取标签,那么获取20或100张图片并不重要。它将是1个查询。

所以你所做的最好,但先得到计数。否则计数将始终为20。

count = Images.objects.all().count()
images = Image.objects.all().order_by('-id').distinct().prefetch_related('tags')[:20]

因此,您无法在1个查询中进行此操作。