相关疑难解决方法(0)

如何聚合(最小/最大等)Django JSONField数据?

我正在使用django 1.9及其内置的JSONField和postgres 9.4.在我的模型的JSONFieldjson字段中,我使用一些值存储对象,包括数字.我需要聚合它们来找到最小/最大值.像这样的东西:

Model.objects.aggregate(min=Min('attrs__my_key'))
Run Code Online (Sandbox Code Playgroud)

提取特定密钥也很有用:

Model.objects.values_list('attrs__my_key', flat=True)
Run Code Online (Sandbox Code Playgroud)

上述查询失败attrs:"无法将关键字'my_key'解析为字段.不允许加入'attrs'."

有可能吗?

注意:1)我知道如何进行简单的postgres查询来完成这项工作,所以我专门搜索ORM解决方案,以便能够过滤等.2)我想这可以用(相对)新的查询表达式/查找api完成但是我还没有研究过它.

django orm json

26
推荐指数
4
解决办法
5965
查看次数

Django使用Postgres在JSONField中注释计数

使用Django,我有一个JSONField类型的字段。我想对json中的嵌套键/值进行不同的计数。在普通场中,您可以像下面这样进行操作

model.objects.values('field_name')\
.annotate(total=Count('field_name')).order_by('-total')
Run Code Online (Sandbox Code Playgroud)

这不适用于JSONField。

示例模型

class Pet(models.Model):
    data = JSONField()
Run Code Online (Sandbox Code Playgroud)

数据示例

  {
    'name':'sparky',
    'animal':'dog',
    'diet':{
        'breakfast':'biscuits',
        'dinner':'meat',
    }
}
Run Code Online (Sandbox Code Playgroud)

Pet.objects.values('data__diet__dinner')\
.annotate(total=Count('data__diet__dinner')).order_by('-total')
Run Code Online (Sandbox Code Playgroud)

的例外

TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

执行此操作的正确方法是什么?

django postgresql django-jsonfield django-annotate

4
推荐指数
1
解决办法
405
查看次数