目前我正在使用 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)
请忽略语法错误。
我该怎么修改呢。有没有内置的功能来帮助我?请建议我改变。 提前致谢。
答案 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()