栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

对于那些有兴趣的人,我已经找到了解决方案(或至少解决方法)。

from django.db.models.expressions import RawSQLModel.objects.annotate(    val=RawSQL("((attrs->>%s)::numeric)", (json_field_key,))).aggregate(min=Min('val')

请注意,

attrs->>%s
表达式将变得像
attrs->>'width'
处理后一样(我是说单引号)。因此,如果您对该名称进行硬编码,则应记住将其插入,否则会出错。

///有点离题///

还有一个与Django本身无关的棘手问题,但需要以某种方式解决。与

attrs
json字段一样,它的键和值也没有限制,您可以(取决于应用程序逻辑)在
width
键中获取一些非数字值。在这种情况下,您将
DataError
因执行上述查询而从postgres
获得。同时NULL值将被忽略,所以可以。如果您可以捕获错误,那么没问题,那么您很幸运。就我而言,我需要忽略错误的值,唯一的方法是编写自定义的postgres函数,以抑制转换错误。

create or replace function safe_cast_to_numeric(text) returns numeric as $$begin    return cast($1 as numeric);exception    when invalid_text_representation then        return null;end;$$ language plpgsql immutable;

然后使用它将文本转换为数字:

Model.objects.annotate(    val=RawSQL("safe_cast_to_numeric(attrs->>%s)", (json_field_key,))).aggregate(min=Min('val')

因此,对于诸如json这样的动态事物,我们得到了相当可靠的解决方案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/616912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号