Django / Postgres:在RangeField上聚合 [英] Django/Postgres: Aggregate on RangeField
问题描述
是否可以在 Django
的 RangeField
上执行聚合功能?
比方说,我们有3个对象,它们的 BigIntegerField
price_range
。
第一个对象: price_range = [10,5000]
第二个对象: price_range = [1,5000]
第3个对象: price_range = [100,9000]
Max
和 Min $的结果c $ c>这三个对象的聚合将是:
min = 1
和 max = 9000
我正在尝试汇总 Max
和 Min
这样:
MyModel.objects.aggregate(Min('price_range'), Max('price_range'),)
哪个会引发错误:
ProgrammingError:函数min(int8range)不存在第1行:
SELECT MIN( app_mymodel。 price_range)AS price_range__min FROM app。 ..
您可以使用 Upper( ..)
和 Lower(..)
这样:
从django.db.models.functions导入上,下
MyModel.objects.aggregate(Min( Lower('price_range')),最大值(上部('price_range')))
但是请注意,如果范围不重叠(例如 [0,20]
和 [50,100]
),您仍然会得到范围 [0,100]
。
显然,现代版本的Django需要命名字段为 @EricTheise说:
从django.db.models.functions导入
上,下
$ p $ >
MyModel.objects.aggregate(
low = Min(Lower('price_range')),
high = Max(Upper('price_range'))
)Is it possible to perform aggregation functions on
Django
'sRangeField
?Let's say we have 3 objects with
BigIntegerField
price_range
.1st obj:
price_range = [10,5000]
2nd obj:
price_range = [1,5000]
3rd obj:
price_range = [100,9000]
The result of
Max
andMin
aggregation of these three objects would be:
min = 1
andmax = 9000
I'm trying to aggregate
Max
andMin
this way:MyModel.objects.aggregate(Min('price_range'),Max('price_range'),)
Which raises error:
ProgrammingError: function min(int8range) does not exist LINE 1: SELECT MIN("app_mymodel"."price_range") AS "price_range__min" FROM "app...
解决方案You can obtain the range bounds with
Upper(..)
andLower(..)
so:from django.db.models.functions import Upper, Lower MyModel.objects.aggregate(Min(Lower('price_range')), Max(Upper('price_range')))
But note that in case the ranges do not overlap (like for example
[0, 20]
and[50, 100]
), you will still get a range[0, 100]
.Apparently modern versions of Django require naming the fields as @EricTheise says:
from django.db.models.functions import Upper, Lower MyModel.objects.aggregate( low=Min(Lower('price_range')), high=Max(Upper('price_range')) )
这篇关于Django / Postgres:在RangeField上聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!