我正在尝试在 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/