Django JSONField并使用ILIKE搜索字典列表

Use*_*ser 4 django

是否可以使用ILIKE(icontains)运算符搜索字典列表中的一个键值?我的json字段看起来像这样:

object = MyModel()
object.json_data = [
    {
        "type": 1,
        "results": [
            {
                "score": 1,
                "comment": "Some text comment 1",
            },
            {
                "score": 2,
                "comment": "Some text comment 2",
            },
            {
                "score": 3,
                "comment": "Some text comment 3",
            }
        ]
    },
    {
        "type": 2,
        "results": [
            {
                "score": 4,
                "comment": "Some text comment 4",
            },
            {
                "score": 5,
                "comment": "Some text comment 5",
            },
            {
                "score": 6,
                "comment": "Some text comment 6",
            }
        ]
    }
]
object.save()
Run Code Online (Sandbox Code Playgroud)

现在,如何编写查询以在"注释"键中搜索?

MyModel.objects.filter(json_data__??__results__??__comment__icontains="text comment")
Run Code Online (Sandbox Code Playgroud)

我正在使用Django 1.9.

谢谢!

The*_*heo 11

这对我有用(注意[])

query = User.objects.filter(data__campaigns__contains=[{'key': 'value'}])
Run Code Online (Sandbox Code Playgroud)

  • 除了不区分大小写的要求之外,这是一个可行的解决方案。 (2认同)

T. *_*tal 10

你应该能够简单地通过链接来搜索,django风格:

MyModel.objects.filter(json_data__results__contains={"comment":"text comment"})
Run Code Online (Sandbox Code Playgroud)

查看Django 1.9中JSON字段的文档:https: //docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#querying-jsonfield

其中包括contains查询:http: //psocdddang目录

如果这对于不区分大小写不起作用,那么我会看到它产生什么查询,并简单地用额外的地方重新编写它:

MyModel.objects.extra(where=["json_data->>'results'->'comment' ILIKE %s"], params=["%text comment%"])
Run Code Online (Sandbox Code Playgroud)

或者您可以使用postgres文档中所述的json特定符号,例如 <@

http://www.postgresql.org/docs/9.5/static/functions-json.html

  • 问题是我无法过滤列表中的所有项目。当我指定 index = "json_data__0__results__0__comment__contains='Text'" 时,一切正常,但如何过滤列表中的所有项目? (2认同)