鉴于搜索词“大文件大书桌”,我如何搜索1)任何结果; 2)所有结果。
我目前正在进行的搜索是:
results = Path.objects.filter(path__icontains=search)
我需要做的是:
results = Path.objects.filter(path__icontains=search.split())
我怎么做这两件事? (OR或AND)
答案 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]