Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过json字段中的json键创建django orm组_Python_Json_Django_Postgresql - Fatal编程技术网

Python 通过json字段中的json键创建django orm组

Python 通过json字段中的json键创建django orm组,python,json,django,postgresql,Python,Json,Django,Postgresql,我在django模型上使用json字段: class JsonTable(models.Model): data = JSONField() type = models.IntegerField() 我尝试了下一个查询,它适用于普通sql字段: JsonTable.objects.filter(type=1).values('type').annotate(Avg('data__superkey')) 但这会引发下一个错误: FieldError: Cannot resolv

我在django模型上使用json字段:

class JsonTable(models.Model):
    data = JSONField()
    type = models.IntegerField()
我尝试了下一个查询,它适用于普通sql字段:

JsonTable.objects.filter(type=1).values('type').annotate(Avg('data__superkey'))
但这会引发下一个错误:

FieldError: Cannot resolve keyword 'superkey' into field. Join on 'data' not permitted.
有没有办法在不使用原始sql的情况下,使用Django ORM或一些python库,在json键上创建group by?

版本:Django 1.9b、PostgreSQL 9.4

更新

例2:

JsonTable.objects.filter(type=1).values('data__happykey').annotate(Avg('data_superkey'))

如果您正在使用此软件包,则在happykey上引发相同的错误, 代码中没有用于管理此类模拟相关查询的内容(data\u some\u json\u key)
由于Json数据是文本,您必须使用原始sql或更好的方法:使用queryset
extra()
方法,但在sql中解析Json似乎很困难。

经过一些研究,我找到了下一个解决方案:

from django.db.models import Count
from django.contrib.postgres.fields.jsonb import KeyTextTransform

superkey = KeyTextTransform('superkey', 'data')
table_items = JsonTable.objects.annotate(superkey = superkey).values('superkey').annotate(Count('id')).order_by()
我不确定order_by(),但说这是必需的。 对于另一个聚合函数类型转换,需要:

from django.db.models import IntegerField
from django.db.models.functions import Cast
superkey = Cast(KeyTextTransform('superkey', 'data'), IntegerField())
我用另一个模型进行测试,希望写这段代码时不会出现打印错误。PostgreSQL 9.6,Django 2.07