【问题标题】:django orm group by json key in json fielddjango orm group by json 字段中的 json 键
【发布时间】:2016-02-04 02:55:55
【问题描述】:

我在我的 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.

有没有办法在 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 上抛出同样的错误

【问题讨论】:

    标签: python json django postgresql


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      如果你正在使用这个包https://github.com/bradjasper/django-jsonfield, 管理此类模拟相关查询的代码中没有任何内容(data__some_json_key) 由于 Json 数据是文本,你将不得不去原始 sql 或更好:使用 queryset extra() 方法,但在 sql 中解析 Json 似乎很困难。

      【讨论】:

        猜你喜欢
        • 2021-08-01
        • 2019-02-28
        • 1970-01-01
        • 2017-12-23
        • 2014-09-05
        • 2020-08-28
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        相关资源
        最近更新 更多