Postgres:使用django在json键上查询值

Sha*_*mux 9 python django django-models django-orm django-postgresql

我需要在django 1.10中的postgres支持的jsonfield上对嵌套键执行values/values_list查询,例如.

class AbcModel(models.model):
    context = fields.JSONField()
Run Code Online (Sandbox Code Playgroud)

如果它的值如下:

{
  'lev1': {
    'lev': 2
  }
}
Run Code Online (Sandbox Code Playgroud)

我想运行像这样的查询

AbcModel.objects.values('context__lev1__lev2').distinct()
AbcModel.objects.values_list('context__lev1__lev2', flat=True).distinct()
Run Code Online (Sandbox Code Playgroud)

编辑: JSON字段是来自django.contrib.postgres.fields的官方django JSONField

Sha*_*mux 11

所以我找到了一个解决方案,这适用于django 1.10及以上版本.我使用KeyTransform来注释和提取nexted键,并在其上执行了values_list.

from django.contrib.postgres.fields.jsonb import KeyTransform
extracted_query = AbcModel.objects.annotate(lev1=KeyTransform('lev1', 'context')).annotate(lev2=KeyTransform('lev', 'lev1'))
Run Code Online (Sandbox Code Playgroud)

此查询允许我将lev1和lev2用作模型中的常规字段,因此我可以对字段执行值,values_list或任何其他有效查询.

Django 1.11允许将两个Transforms嵌套在一个annotate中,不确定关于嵌套的1.10,因为我已升级到1.11