是否可以使用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。
谢谢!
答案 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'}])