我正在使用内置的Django 1.9 JSONField
和Postgres
9.4。在模型的attrs
json字段中,我存储带有一些值(包括数字)的对象。我需要汇总它们以找到最小/最大值。像这样:
Model.objects.aggregate(min=Min('attrs__my_key'))
另外,提取特定的密钥将很有用:
Model.objects.values_list('attrs__my_key', flat=True)
上面的查询失败了
FieldError:“无法将关键字’my_key’解析为字段。不允许加入’attrs’。”
有可能吗?
笔记:
对于那些有兴趣的人,我已经找到了解决方案(或至少解决方法)。
from django.db.models.expressions import RawSQL
Model.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这样的动态事物,我们得到了相当可靠的解决方案。
问题内容: 如何在Rails 3中创建按时间片聚合的活动关系查询? 我想建立一个查询,该查询每隔n分钟可以返回具有特定名称的计数器的每个样本的最小值,最大值,平均值,总和,计数。 问题答案: 不幸的是,我从未使用过Postgres,因此该解决方案可在MySQL中使用。但是我认为您可以找到Postgres类似物。 用法 等等
我正在尝试获取日期的最大值和最小值。 从文档中,我看不到composite中的max选项:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html#_value_sources 我想要这样的东西: 是否可以添加到此查询中,
我有一个Rest API的测试计划,其中有一个线程组和两个采样器。同时运行负载测试 线程数(用户):80 加速期:1 我得到"响应代码: 504响应消息:GATEWAY_TIMEOUT"在jmeta. 我观察到,当聚合图中的最大值达到60000ms时,所有响应都超时。需要采取哪些措施来防止超时问题。当我使用50个或更少的用户时,负载测试工作正常。
我对min()和max()中关键参数的行为有点迷惑不解 假设我有以下列表: 我希望max值高于20,所以我做了:。结果是25,应该是50。 我希望max值低于20,所以我做了:。结果是10,应该是15。 min()也是如此。如果我希望最小值大于20(),则给出的值是10,而不是25。 谁能帮忙解释一下吗?我想更好地理解,以避免在处理不同条件时出现错误。
问题内容: 可以说有一个嵌套列表,例如: 在此函数上调用时: 收到的输出是 为什么以及如何运作?它有哪些用例? 问题答案: 如何在Python中比较列表和其他序列? 从字典上比较Python中的列表(和其他序列),而不是基于任何其他参数。 可以将序列对象与具有相同序列类型的其他对象进行比较。比较使用 字典 顺序:首先比较前两个项目,如果它们不同,则确定比较的结果;如果它们相等,则比较下两个项目,依
问题内容: 我试图使用s或函数读取稍大的数据集,但我一直遇到s。数据框的最大大小是多少?我的理解是,只要数据适合内存,数据帧就应该可以,这对我来说不是问题。还有什么可能导致内存错误? 就上下文而言,我试图在《2007年消费者金融调查》中阅读ASCII格式(使用)和Stata格式(使用)。该文件的dta大小约为200MB,而ASCII的大小约为1.2GB,在Stata中打开该文件将告诉我,对于22,