【问题标题】:Django lookup by JSONField array valueDjango 通过 JSONField 数组值查找
【发布时间】: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


    【解决方案1】:

    在同一帖子中关注此 answer 和链接的 answer

    'contains' 或 'icontains' 查找模式 '%string%',在您的情况下假定 '67' 在字符之间。但是,数字模式在您的演员姓名的末尾。

    因此,根据我链接的答案,您可能应该尝试 endswithiendswith,以查找模式“%67”

    【讨论】:

    • 感谢您的帮助,但不幸的是,这不起作用。很可能是因为“演员”是一个 JSON 字段或 smt。
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2020-10-08
    • 2020-08-13
    • 2016-07-23
    相关资源
    最近更新 更多