首页 > 解决方案 > 包含匹配的 Django ArrayField 过滤

问题描述

我正在使用 Django Postgres ArrayField

response_headers = ArrayField(models.TextField(blank=True),blank=True,null=True,default=list)

假设我们的对象有以下数据:

obj1 : response_headers = ["dubai","sydney","nyc"]
obj2 : response_headers = ["mumbai","kerela","dubai"]
MyModel.objects.filter(response_headers__contains=['dubai']

会返回obj1&obj2但是

MyModel.objects.filter(response_headers__contains=['duba']
   or 
MyModel.objects.filter(response_headers__contains=['uba']

不会返回任何对象<QuerySet []>

如何实现在 ArrayField 的所有索引中使用部分模式进行搜索的能力?

标签: djangodjango-modelsdjango-rest-frameworkdjango-formsdjango-templates

解决方案


是的,只有精确的元素匹配是可能的。

MyModel.objects.filter(response_headers__contains=['duba'])

将使用 postgresql contains 运算符执行完全匹配搜索@>


但是,如果 ArrayField 仅包含简单的字符串,则存在一个 hacky 选项可能适合:

MyModel.objects.filter(response_headers__icontains='duba')

这将ArrayField转换为文本,将其大写并执行LIKE '%DUBA%'

因此,它不会检查数组中是否有任何元素(i)像'duba',而是将数组转换为一个字符串(如果元素不是简单的字符串 - 结果可能是不可取的) - 即{dubai,sydney,nyc}然后执行不区分大小写的匹配它与论据duba


推荐阅读