查询 django JSONField 以获取嵌套对象列表中的嵌套值

Alo*_*hor 5 django postgresql django-jsonfield

我有一个句子模型,其元数据为JSONField
一个示例行是

Sentence.objects.filter(id=6753315).values('id', 'metadata')[0]

{'id': 6753315,
 'metadata': [{'filters': [{'id': None, 'level_name': 'Brand Hierarchy'},
                           {'id': None, 'level_name': 'Category Hierarchy'}],
               'product': None,
               'themes': [{'id': 35299, 'sentiment': 'Positive'},
                          {'id': 35301, 'sentiment': 'Positive'}]}]}
Run Code Online (Sandbox Code Playgroud)

元数据是对象列表,该对象具有嵌套的对象列表。
我想根据主题 id 查询这些行。在此示例中,元数据列表的行长度为 1,主题列表的长度为 1,因此很容易查询,例如

In [30]: Sentence.objects.filter(id=6753315, metadata__0__themes__0__contains={"id": 35299})
Out[30]: <QuerySet [<Sentence: Sentence object>]>
Run Code Online (Sandbox Code Playgroud)

但是元数据和主题的长度可以是任何长度,所以我如何查询这些行来检查该行中是否存在某个主题 id,或者不存在任何长度的元数据和主题。

我只想找出具有特定主题 id 的所有行

Sentence.objects.filter(metadata__*__themes__*__contains={"id": 35299})  
Run Code Online (Sandbox Code Playgroud)

我不知道这样写的索引*是为了让我的问题易于理解。

Igo*_*ger 0

哇,我明白了

Sentence.objects.filter(metadata__contains=[{'themes': [{"id": 35299}]}])
Run Code Online (Sandbox Code Playgroud)