json字段中的Django orm按json键分组

2024-06-02 05:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class JsonTable(models.Model):
    data = JSONField()
    type = models.IntegerField()

我尝试了下一个查询,它适用于普通的sql字段:

^{pr2}$

但这会引发下一个错误:

FieldError: Cannot resolve keyword 'superkey' into field. Join on 'data' not permitted.

有没有办法在json键上使用Django-ORM或一些python库,而不使用原始sql?

版本:Django 1.9b,PostgreSQL 9.4

更新

例2:

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

happykey上引发相同的错误


Tags: django模型jsonsqldatamodelmodelstype
2条回答

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

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(),但documentation说这是必需的。 对于另一个需要的聚合函数类型转换:

^{pr2}$

我用另一个模型测试,希望写这段代码不要有误。PostgreSQL 9.6,Django 2.07

如果您使用的是这个包https://github.com/bradjasper/django-jsonfield, 代码中没有用于管理此类模拟相关查询的内容(data\uujson\u key) 由于Json数据是文本,因此必须使用原始sql或更好的方法:使用querysetextra()方法,但是在sql中解析Json似乎很困难。在

相关问题 更多 >