给定搜索词“大文件大办公桌”,我将如何搜索 1) 任何结果;2)所有的结果。
我目前正在做的搜索是:
results = Path.objects.filter(path__icontains=search)
我需要做的是类似的事情:
results = Path.objects.filter(path__icontains=search.split())
我将如何做到这两点?(或或与)
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())))
您需要知道的第一件事是您在过滤时实际上并没有访问数据库,因此您可以多次进行过滤而不会损失太多性能,第一种方法可以是:
results = Path.objects.all()
for s in search.split():
results = results.filter(path__icontains = s)
那是 AND 你可以使用类似的方法来处理 or。
构建一个列表推导并使用 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]