【发布时间】:2018-02-12 18:11:12
【问题描述】:
考虑到大约有 500 万个对象,我正在尝试在 Django 中为我的系统创建高效的搜索功能。
这就是我设置查询的方式:
objects_found = (Model.objects.extra(where=["CHAR_LENGTH(attribute) > 300"])).filter(attribute__trigram_similar=query)
我知道这个 QuerySet 尚未完全评估,而这正是我不想要的。
例如,要像这样完成评估设置的 QuerySet:
list(objects_found)
大约需要 60 秒。
如果我想以经典方式获取设置的 QuerySet 的第一项,仍然需要大约 60 秒,因为查询是针对所有对象启动的:
objects_found[0]
但是如果我使用像first()这样的方法:
objects_found.first()
大约需要 9 秒,这意味着不评估完整的 QuerySet。
假设objects_found 有500 个对象。如果我需要做这样的事情怎么办:
objects_found[40]
或者这个:
objects_found[:15]
以一种省时的方式?
p.s 切片确实会在 db 级别创建偏移选项,但由于某种原因在时间上没有差异。
因此,代码不会搜索所有 500 个对象,而是仅搜索 40 或 15 对象。
在 Django QuerySet 中是否有任何实现可以做到这一点?
【问题讨论】: