Django数据库搜索关键字,而不是确切的文本

时间:2013-01-25 01:08:17

标签: python django

鉴于搜索词“大文件大书桌”,我如何搜索1)任何结果; 2)所有结果。

我目前正在进行的搜索是:

results = Path.objects.filter(path__icontains=search)

我需要做的是:

results = Path.objects.filter(path__icontains=search.split())

我怎么做这两件事? (OR或AND)

3 个答案:

答案 0 :(得分:3)

from django.db.models import Q
from operator import or_

# AND - use argument unpacking
Path.objects.filter(*(Q(path__icontains=s)
                      for s in search.split()))

# OR - use reduce
Path.objects.filter(reduce(or_, (Q(path__icontains=s)
                                 for s in search.split())))

答案 1 :(得分:1)

您需要知道的第一件事是,您在过滤时实际上并没有访问数据库,因此您可以多次执行过滤而不会损失太多性能,第一种方法可以是:

results = Path.objects.all()
for s in search.split():
    results = results.filter(path__icontains = s)

对于AND ans,您可以使用类似的方法或。

答案 2 :(得分:0)

构建列表解析并使用reduce函数:

keywords = search.strip().split()
list_path_qs = [Q(path__icontains=x) for x in keywords]
final_q = reduce(operator.and_, list_path_qs)
results = Path.objects.filter(final_q)[:100]