0

给定搜索词“大文件大办公桌”,我将如何搜索 1) 任何结果;2)所有的结果。

我目前正在做的搜索是:

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

我需要做的是类似的事情:

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

我将如何做到这两点?(或或与)

4

3 回答 3

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())))
于 2013-01-26T02:23:01.787 回答
1

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

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

那是 AND 你可以使用类似的方法来处理 or。

于 2013-01-25T01:23:04.860 回答
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]
于 2013-01-25T01:19:53.860 回答