【问题标题】:How to make advance search in Django?如何在 Django 中进行高级搜索?
【发布时间】:2017-08-08 12:51:49
【问题描述】:

目前我在 Django 中工作,更准确地说是在过滤方法中工作。

根据我的知识过滤器是这样工作的。如果我搜索“Apple iphone 7 plus”,它将在我的记录中找到它出现的整个句子,但我想以下列方式修改此过滤器。我想将查询拆分为单词,然后在文档中找到这些单词进行搜索,例如上层查询应该返回那些包含“apple”&&“iphone”&&“7”&&“plus”的记录。

谁能告诉我如何改进我的查询。 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)

请忽略语法错误。

我该如何修改它。有什么内置功能可以帮助我吗?请建议我更改。 提前致谢。

【问题讨论】:

标签: python django


【解决方案1】:

简单的解决方案是:

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

而且您不需要异常 Mobile_DB.DoesNotExist,过滤器永远不会引发它。

【讨论】:

  • 哇!从来不知道布尔运算符可以像这样在循环中链接。
【解决方案2】:

您可以创建 OR 查询:

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

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

【讨论】:

  • 如何自动查询从输入中挑选出来的单词?
  • OP 正在寻找 AND (&) 查询。他想要获取包含查询中所有给定单词的记录。您已经回答了OR (|) 查询。
【解决方案3】:

让我知道此解决方案是否适合您,查询每个单词并提供所有数据的联合。对于很多记录来说可能有点慢。我会建议使用存储过程进行更复杂的搜索。

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()

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2013-08-12
    • 2021-10-13
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2014-04-30
    • 2021-04-08
    相关资源
    最近更新 更多