django - 包含匹配的 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 的所有索引中使用部分模式进行搜索的能力?
解决方案
是的,只有精确的元素匹配是可能的。
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
。
推荐阅读
- html - > 指向下方的代码是什么?
- swift - Websocket 不断断开连接(红蜘蛛)
- nginx - 谷歌云 TCP 负载均衡器转发 ip
- javascript - 如何在javascript中按值对整数键对象进行排序
- angular - ng-bootstrap 弹出数据库内容
- php - 如何停止在foreach中覆盖数组
- javascript - 在 Javascript 中调用嵌套的 div 类。修改后的代码在 WordPress 中不起作用
- java - 相当于python中的objectmapper
- python - 在一堆行上使用 lstrip 时,只有以 'r' 开头的那些会受到影响,而 'r' 会被删除,保持其他相同
- swift - 在一行中找到重复的序列