python - Django的objects.filter, "expensive"怎么会是这样?

标签 python sql django search optimization

我正在尝试在 Django 中创建搜索 View 。它是一个搜索表单,带有自由文本输入+一些可供选择的选项,以便您可以按年份等进行过滤。这是到目前为止我在 View 中的一些代码,即执行过滤的部分。我想了解一下这在数据库服务器上的成本是多少。

soknad_list = Soknad.objects.all()

如果 var1:
    soknad_list = soknad_list.filter(pub_date__year=var1)

如果变量2:
    soknad_list = soknad_list.filter(muncipality__name__exact=var2)

如果变量3:
    soknad_list = soknad_list.filter(genre__name__exact=var3)

# 文本搜索
stop_word_list = re.compile(STOP_WORDS, re.IGNORECASE)
search_term = '%s' % request.GET['q']
clean_search_term = stop_word_list.sub('', search_term)
clean_search_term = clean_search_term.strip()
如果 len(cleaned_search_term) != 0:
    soknad_list = soknad_list.filter(Q(dream__icontains=cleaned_search_term) | Q(tags__icontains=cleaned_search_term) | Q(name__icontains=cleaned_search_term) | Q(school__name__icontains=cleaned_search_term))

所以我要做的是,首先列出所有对象,然后检查哪些变量存在(我在之前使用 GET 获取这些变量),然后过滤结果(如果存在)。但这看起来不太优雅,它可能会执行很多查询才能获得结果,那么有没有更好的方法呢?

它正是我想要的,但我想有一个更好/更聪明的方法来做到这一点。有什么想法吗?

最佳答案

过滤器本身不执行查询,除非您显式从查询中获取项目(例如 get),否则不会执行任何查询,并且 list( query ) 也会执行它。

关于python - Django的objects.filter, "expensive"怎么会是这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/383760/

相关文章:

python - 将值从 python 列表传递到 Cassandra 查询

python - 如何使用 python 从 geojson 匀称地创建 GeometryCollection?

django - 'WSGIRequest' 对象没有属性 'get'

python - 在 Django 模板中获取代理用户对象

python - 只能将元组(不是 "unicode")连接到元组

python - 在 Python 中,为什么控制台输出偶尔会暂停,直到按下 ctrl-c,我该如何停止?

mysql - 查找整个组的列值为 'P' 的行

sql - T-SQL CASE WHEN 语句不适用于 between

sql - Postgres 时间戳差异似乎错过了 1 小时?

django模板ModelChoiceField长度