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