Python Django db搜索关键字,不是精确文本

Python Django db搜索关键字,不是精确文本,python,django,Python,Django,如果搜索词是“大文件大桌子”,我将如何搜索1)任何结果;2)所有结果 我目前正在进行的搜索是: results = Path.objects.filter(path__icontains=search) 我需要做的事情大致如下: results = Path.objects.filter(path__icontains=search.split()) 我要怎么做这两件事?(或和)建立列表理解并使用reduce函数: keywords = search.strip().split() list

如果搜索词是“大文件大桌子”,我将如何搜索1)任何结果;2)所有结果

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

results = Path.objects.filter(path__icontains=search)
我需要做的事情大致如下:

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

我要怎么做这两件事?(或和)

建立列表理解并使用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]

建立一个列表并使用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]

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

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

也就是说,对于ans,您可以使用类似的方法来处理或。

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

results = Path.objects.all()
for s in search.split():
    results = results.filter(path__icontains = s)
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=results.filter(…)
这不会像发布的那样工作;您需要将筛选器调用的结果重新分配给自身
results=results.filter(…)
是否有办法修改此选项以同时搜索多个字段,例如查找标题或描述上的文本或其他内容?这取决于您的具体要求,但您可能只希望每个字段都有一个
Q
对象,并使用
操作符将其连接起来,类似于生成器表达式内部的
Q(title\uu i contains=s)| Q(description\uu i contains=s)
之类的内容。是否有方法修改此项以同时搜索多个字段,例如查找标题或描述上的文本或其他内容?这取决于您的确切要求,但您可能只想为每个字段创建一个
Q
对象,并将它们与
操作符连接起来,类似于生成器表达式内部的
Q(title_ui contains=s)| Q(description_ui contains=s)
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())))