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)
会回来obj1,obj2但是
MyModel.objects.filter(response_headers__contains=['duba']
or
MyModel.objects.filter(response_headers__contains=['uba']
Run Code Online (Sandbox Code Playgroud)
不会返回任何对象<QuerySet []>
如何实现在 ArrayField 的所有索引中使用部分模式进行搜索的能力?
是的,只能进行精确的元素匹配。
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。