gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:55:08 24 4
gpt4 key购买 nike

我正在使用带有内置 JSONField 和 Postgres 9.4 的 Django 1.9。在我的模型的 attrs json 字段中,我存储具有一些值的对象,包括数字。我需要汇总它们以找到最小/最大值。像这样的:

Model.objects.aggregate(min=Min('attrs__my_key'))

另外,提取特定的键也很有用:

Model.objects.values_list('attrs__my_key', flat=True)

上述查询失败

FieldError: "Cannot resolve keyword 'my_key' into field. Join on 'attrs' not permitted."

有可能吗?

注意事项:

  1. 我知道如何使用简单的 Postgres 查询来完成这项工作,但我正在专门寻找一种 ORM 解决方案以具有过滤等功能。
  2. 我想这可以通过(相对)新的查询表达式/查找 API 来完成,但我还没有研究过。

最佳答案

从 django 1.11(还没有发布,所以这可能会改变)你可以使用 django.contrib.postgres.fields.jsonb.KeyTextTransform而不是 RawSQL .

在 django 1.10 中,您必须复制/粘贴 KeyTransform给你自己的 KeyTextTransform 并将 -> 运算符替换为 ->>#> 替换为 # >> 所以它返回文本而不是 json 对象。

Model.objects.annotate(
val=KeyTextTransform('json_field_key', 'blah__json_field'))
).aggregate(min=Min('val')

您甚至可以在 SearchVectors 中包含 KeyTextTransforms 以进行全文搜索

Model.objects.annotate(
search=SearchVector(
KeyTextTransform('jsonb_text_field_key', 'json_field'))
)
).filter(search='stuff I am searching for')

请记住,您也可以在 jsonb 字段中建立索引,因此您应该根据您的具体工作量来考虑。

关于json - 如何在 Django JSONField 数据上聚合(最小/最大等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34325096/

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