Django分页查询重复,时间加倍
在我当前的项目中,我想对查询集进行一些过滤和排序,并以分页的形式向用户显示。Django分页查询重复,时间加倍,django,pagination,query-optimization,django-queryset,Django,Pagination,Query Optimization,Django Queryset,在我当前的项目中,我想对查询集进行一些过滤和排序,并以分页的形式向用户显示。 这很好,但是我对性能不满意。 当我在模型元排序中显式或隐式地使用和排序_by语句时,我可以在调试工具栏中看到该查询实际上执行了两次。 一次用于分页器计数(不带ORDER BY),一次用于获取对象切片(带ORDER BY)。 根据我的观察,这导致所需时间加倍 有什么方法可以优化它吗 下面是一个简单的工作示例,在我的实际应用程序中,我使用基于类的视图 class Medium(models.Model): titl
这很好,但是我对性能不满意。
当我在模型元排序中显式或隐式地使用和排序_by语句时,我可以在调试工具栏中看到该查询实际上执行了两次。
一次用于分页器计数(不带ORDER BY),一次用于获取对象切片(带ORDER BY)。
根据我的观察,这导致所需时间加倍 有什么方法可以优化它吗 下面是一个简单的工作示例,在我的实际应用程序中,我使用基于类的视图
class Medium(models.Model):
title = models.CharField(verbose_name=_('title'),
max_length=256,
null=False, blank=False,
db_index=True,
)
offered_by = models.ForeignKey(Institution,
verbose_name=_('Offered by'),
on_delete=models.CASCADE,
)
quantity = models.IntegerField(verbose_name=_('Quantity'),
validators=[
MinValueValidator(0)
],
null=False, blank=False,
)
deleted = models.BooleanField(verbose_name=_('Deleted'),
default=False,
)
查询没有完全重复:一个是
计数
查询,另一个获取请求的特定页面的实际对象。这是不可避免的,因为Django的Paginator
需要知道对象的总数。但是,如果查询集媒体不是太大,您可以通过强制计算媒体查询集来进行优化(只需在定义分页器之前添加一行len(媒体)
)
但是请注意,如果media
非常大,在将所有对象加载到内存中时,您可能不想强制对media
进行求值。很遗憾,强制对queryset求值不是一个选项。我只是好奇是否还有其他优化,因为我注意到COUNT
查询缺少ORDER\u BY
。如果省略.order\u by()
,则第二个查询执行得更快。但我现在想,这完全有道理。那么,除了接受两个查询之外,别无选择。当然,你需要的结果/页面总数是不可避免的。
def index3(request):
media = Medium.objects.filter(deleted=False, quantity__gte=0)
media = media.exclude(offered_by_id=request.user.institution_id)
media = media.filter(title__icontains="funktion")
media = media.order_by('title')
paginator = Paginator(media, 25)
media = paginator.page(1)
return render(request, 'media/empty2.html', {'media': media})