如何在Django中进行高级搜索?

时间:2017-08-08 12:51:50

标签: python django

目前我正在使用 Django ,更准确地说是在过滤方法中。

据我所知,过滤器的工作原理如下。如果我搜索“Apple iphone 7 plus”,它会在我的记录中找到整个句子,但我想以下列方式修改此过滤器。我想用文字分割查询,然后在文档中找到要搜索的那些单词,就像上层查询应该返回那些包含“apple”&& “iphone”&& “7”&& “加”。

任何人都可以告诉我如何改进我的查询。 django中内置的功能可以帮助我。

我最近的代码如下所示。

@api_view(['GET'])
def Filter_Mobiles(request,query):

   print(query)
   try:
      que = Q(SNR_Title__icontains=query )
   Mobile_all = Mobile_DB.objects.filter(que)

   except Mobile_DB.DoesNotExist:

       return Response(status=status.HTTP_404_NOT_FOUND)

请忽略语法错误。

我该怎么修改呢。有没有内置的功能来帮助我?请建议我改变。 提前致谢。

3 个答案:

答案 0 :(得分:2)

简单的解决方案是:

que = Q()
for word in query.split():
    que &= Q(SNR_Title__icontains=word)
Mobile_all = Mobile_DB.objects.filter(que)

并且您不需要异常Mobile_DB.DoesNotExist,过滤器永远不会提升它。

答案 1 :(得分:0)

您可以创建OR查询:

Mobile_DB.objects.filter(Q(SNR_Title__icontains='apple') | Q(SNR_Title__icontains='iphone'))

但它仍然只会创建一个SQL查询,这对于复杂的搜索来说是不够的。 我建议你查看http://haystacksearch.org/女巫是Django的一个模块,它可以让你轻松地将复杂的搜索引擎连接到你的Django模型。

答案 2 :(得分:0)

如果此解决方案适合您,请告诉我,查询每个单词并提供所有数据的并集。很多记录可能有点慢。我建议使用存储过程进行更复杂的搜索。

queryset_final = None

for q in query.split(' '):
    que = Mobile_DB.objects.filter(Q(SNR_Title__icontains=q))
    if queryset_final:
        queryset_final = queryset_final | que
    else:
        queryset_final = que

Mobile_all = queryset_final.distinct()