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

时间:2016-02-20 11:16:04

标签: 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()

现在,如何编写查询以搜索"评论"键?

MyModel.objects.filter(json_data__??__results__??__comment__icontains="text comment")

我正在使用Django 1.9。

谢谢!

2 个答案:

答案 0 :(得分:10)

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

MyModel.objects.filter(json_data__results__contains={"comment":"text comment"})

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

包括contains查找: https://docs.djangoproject.com/es/1.9/ref/contrib/postgres/fields/#std:fieldlookup-hstorefield.contains

如果这对于不区分大小写不起作用,那么我会看到它产生什么查询,只需在额外的地方重做:

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

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

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

答案 1 :(得分:7)

这对我有用(请注意[]

query = User.objects.filter(data__campaigns__contains=[{'key': 'value'}])