【问题标题】:Case-insensitive search on a postgres ArrayField with django使用 django 对 postgres ArrayField 进行不区分大小写的搜索
【发布时间】:2015-12-28 02:29:57
【问题描述】:

In the Django documentation for ArrayField,它列出了一个contains 字段查找。但是,ArrayField 中不存在 icontains(不区分大小写的查找 - 许多其他字段都有)查找。

我需要一个不区分大小写的 ArrayField 查找函数,类似于预先存在的 contains 查找。

【问题讨论】:

    标签: python django database postgresql


    【解决方案1】:

    您可以使用icontains 进行不区分大小写的查找,方法是省略用于contains 的方括号:

    queryset = my_model.objects.filter(field_name__icontains='my_substring')
    

    这是因为 Postgres 将 ArrayField 转换为文本,然后检查 'my_substring' 作为数组文本表示的子字符串。您可以通过检查结果查询来看到这一点:

    print(queryset.query)
    
    # raw SQL output:
    'SELECT ... WHERE UPPER("my_model"."field_name"::text) LIKE UPPER(%my_substring%)
    

    这在 Postgres 10.1 中对我有用。


    作为附录,我应该披露这种方法导致我的项目出现错误。假设您要检查数组字段是否包含'my_substring'

    field_name__icontains='my_substring'
    

    这将检索'my_substring',但它也会检索'foo_my_substring'。这与上面提到的字符串转换有关。使用风险自负。

    【讨论】:

      【解决方案2】:

      icontainsiexact 仅适用于字符串类型:

      my_array_field__contains=['H'] 
      

      检查 ['H'] 是否在 my_array_field 中包含

      但如果你尝试以下方法,它会起作用:

      my_array_field__0__icontains='H'
      

      因为它检查第一个元素是否包含 H 或 h

      【讨论】:

        【解决方案3】:

        您可以像这样查询不区分大小写的数组搜索:

        select 'tartu' ILIKE ANY (array['Tallinn', 'Tartu','Narva']);
        

        在 Django 中:

        MyModel.objects.extra(
            where=['%s ILIKE ANY (array_column_name)'],
            params=['tartu', ]
        )
        

        【讨论】:

          猜你喜欢
          • 2021-06-14
          • 2011-10-17
          • 1970-01-01
          • 1970-01-01
          • 2012-12-20
          • 2010-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多