gpt4 book ai didi

python - django orm 组按 json 字段中的 json 键

转载 作者:太空狗 更新时间:2023-10-29 20:30:23 26 4
gpt4 key购买 nike

我在我的 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 键进行分组?

版本:Django 1.9b,PostgreSQL 9.4

更新

示例 2:

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

happykey 上抛出同样的错误

最佳答案

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

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

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

关于python - django orm 组按 json 字段中的 json 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com