django - Django分页查询重复,时间加倍
问题描述
在我当前的项目中,我想对查询集进行一些过滤和排序,并以分页形式向用户显示。
这很好用,但是我对性能不满意。
当我在模型元排序中显式或隐式使用 and order_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,
)
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})
解决方案
查询并不完全重复:一个是COUNT
查询,另一个获取请求的特定页面的实际对象。这是不可避免的,因为 DjangoPaginator
需要知道对象的总数。但是,如果查询集media
不是太大,您可以通过强制media
评估查询集来优化(只需len(media)
在定义分页器之前添加一行)。
但请注意,如果media
非常大,您可能不想media
在将所有对象加载到内存时强制进行评估。
推荐阅读
- azure - 应用注册创建的服务主体 - 强制?
- java - Jackson @JsonIdentityInfo 和 @JsonIdentityReference 和自定义序列化
- php - PHP中的标头重定向
- html - 手机上点击的链接在页面底部打开图像,而不是在链接位置
- python - 将月份和年份分开的两列合并为一列以减法天数
- python - 在 Mac Os 上使用 Tkinter Gui 时出现启动错误
- amazon-ec2 - 有什么方法可以从 Azure DevOps 发布管道启动 EC2 实例?
- reactjs - 新请求不发送以前收到的 http cookie
- r - 使用 R 库 rvest 进行 Goodread 网页抓取
- java - 我应该重构它以使用地图吗?