Django ArrayField 过滤包含匹配

Arb*_*ain 6 django django-templates django-models django-forms django-rest-framework

我正在使用 Django Postgres ArrayField

response_headers = ArrayField(models.TextField(blank=True),blank=True,null=True,default=list)
Run Code Online (Sandbox Code Playgroud)

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

obj1 : response_headers = ["dubai","sydney","nyc"]
obj2 : response_headers = ["mumbai","kerela","dubai"]
Run Code Online (Sandbox Code Playgroud)
MyModel.objects.filter(response_headers__contains=['dubai']
Run Code Online (Sandbox Code Playgroud)

会回来obj1obj2但是

MyModel.objects.filter(response_headers__contains=['duba']
   or 
MyModel.objects.filter(response_headers__contains=['uba']
Run Code Online (Sandbox Code Playgroud)

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

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

Ole*_*kin 8

是的,只能进行精确的元素匹配。

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

Run Code Online (Sandbox Code Playgroud)

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


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

MyModel.objects.filter(response_headers__icontains='duba')
Run Code Online (Sandbox Code Playgroud)

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

因此,它不会检查数组中是否存在任何像“duba”这样的元素,而是将数组转换为一个字符串(如果元素不是简单字符串 - 结果可能不理想) - 即然后执行不区分大小写的{dubai,sydney,nyc}匹配对其进行论证duba