【发布时间】:2022-11-30 17:15:39
【问题描述】:
假设我有具有这种结构的 MySQL 数据库记录
{
"id": 44207,
"actors": [
{
"id": "9c88bd9c-f41b-59fa-bfb6-427b1755ea64",
"name": "APT41",
"scope": "confirmed"
},
{
"id": "6f82bd9c-f31b-59fa-bf26-427b1355ea64",
"name": "APT67",
"scope": "confirmed"
}
],
},
{
"id": 44208,
"actors": [
{
"id": "427b1355ea64-bfb6-59fa-bfb6-427b1755ea64",
"name": "APT21",
"scope": "confirmed"
},
{
"id": "9c88bd9c-f31b-59fa-bf26-427b1355ea64",
"name": "APT22",
"scope": "confirmed"
}
],
},
...
“演员”是一个 JSONField
例如,我可以通过任何方式过滤演员姓名包含“67”的所有对象吗?
我拥有的最接近的变体是我让它像那样工作:
queryset.filter(actors__contains=[{"name":"APT67"}])
但是这个查询匹配精确的 actor.name 值,而我想接受“包含”运算符。
我还通过使用严格的数组索引进行查询来使其工作,如下所示:
queryset.filter(actors__0__name__icontains='67')
但它仅在数组中的第一个元素符合我的要求时才匹配。而且我需要在他的任何演员中返回该对象匹配我的查询,所以我期待像queryset.filter(actors__name__icontains='67')这样的东西可以工作,但它没有工作:(
到目前为止,我必须使用 models.Q 和多个 ORs 来支持我的需求,就像这样 -
search_query = models.Q(actors__0__name__icontains='67') | models.Q(actors__1__name__icontains='67') | models.Q(actors__2__name__icontains='67') | models.Q(actors__3__name__icontains='67')
queryset.filter(search_query)
但这看起来很糟糕,只支持 4 个元素查找(或者我必须包含更多 OR)
如果有可能以正常方式整体解决,有什么线索吗?
【问题讨论】:
标签: python mysql django django-models django-rest-framework