如何在Django模型中使用JSONField的查询集中使用包含

时间:2019-06-03 14:34:39

标签: python json django

我的Django模型中有这个JSONField:

{
    "site-acces": {
        "title": "digimon",
        "compare": {
            "with": "sagromon",
        }
    },
  "site-denied": {
        "title": "pokemon",
        "compare": {
            "with": "salameche",
        }
    }
}

我想在Django中执行以下操作: 在我的Json中搜索所有标题中包含“ pokemon”的对象。

我尝试过:

pokemon.filter(widgets__contains={'title': 'pokemon'})

但是它不起作用...这使我返回了空的查询集。 所以我也尝试过:

pokemon.filter(widgets__title= 'pokemon')

,但也不起作用。我认为这是行不通的,因为“ title”元位于“ site-denied”内...

所以我问我如何在这个“被拒绝的网站”中搜索字符串。但是要小心!它并不总是“拒绝站点”,有时可能是“站点访问”或其他随机字符串。因此,我无法使用“网站拒绝”字词进行搜索。

1 个答案:

答案 0 :(得分:1)

如果只有两个键,请使用Q 表达式:

from django.db.models import Q

pokemon.filter(
    Q(**{'widget__site-acces__title__contains': 'pokemon'}) | 
    Q(**{'widget__site-denied__title__contains': 'pokemon'})
)

如果您不知道所有可能的键,请考虑将标题存储在其他结构中。