【问题标题】:Django Queryset icontains() method not returning exact matchDjango Queryset icontains() 方法不返回完全匹配
【发布时间】:2019-03-28 01:14:01
【问题描述】:

我正在尝试通过传递文本查询来过滤模型,并检查是否有任何字段包含与给定文本查询完全或部分匹配的值。

假设我有一个名为Sample 的模型,其中包含字符字段["name", "state", "type"]。 假设模型对象之一的值为state 设置为"barely alive"

我查看了以下 django 文档中描述的方法: https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/search/

我想使用"barely"、"arely" 或"barely alive" 中的任何一个作为文本查询来检索该对象。

我最初尝试过类似Sample.objects.annotate(search=SearchVector(*list_of_fields)).filter(search__icontains=query_text)

但是,如果我将全文barely alive 作为查询文本传递并且仅在传递诸如barely 或alive 之类的部分文本时,上述行将不会返回正确的查询集。

然后我尝试了 Sample.objects.annotate(search=SearchVector(*list_of_fields)).filter(search=query_text).filter(search__icontains=query_text) 但随后它返回一个空的查询集。

我在这里缺少什么?

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    PostgreSQL 的全文搜索在部分匹配方面有相当多的复杂性,参见例如here 和 here。

    但是,如果您尝试使用OR 查询,这并不困难,您只需要一个适当构造的Q object 而不是两个链接的filter 调用(因为过滤器链接使用AND,不是OR)。所以而不是

    .filter(search=query_text).filter(search__icontains=query_text)
    

    使用

    .filter(Q(search=query_text) | Q(search__icontains=query_text))
    

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多