Django/Postgres:在 RangeField 上聚合
Django/Postgres: Aggregate on RangeField
是否可以对 Django
的 RangeField
执行聚合函数?
假设我们有 3 个对象 BigIntegerField
price_range
.
第一个对象:price_range = [10,5000]
第二个对象:price_range = [1,5000]
第三个对象:price_range = [100,9000]
Max
和Min
这三个对象的聚合结果为:
min = 1
和 max = 9000
我正在尝试以这种方式汇总 Max
和 Min
:
MyModel.objects.aggregate(Min('price_range'),Max('price_range'),)
引发错误:
ProgrammingError: function min(int8range) does not exist LINE 1:
SELECT MIN("app_mymodel"."price_range") AS "price_range__min" FROM "app...
您可以使用 Upper(..)
和 Lower(..)
获得范围边界,因此:
from django.db.models.functions import <b>Upper, Lower</b>
MyModel.objects.aggregate(Min(<b>Lower(</b>'price_range'<b>)</b>), Max(<b>Upper(</b>'price_range'<b>)</b>))
但请注意,如果范围不重叠(例如 [0, 20]
和 [50, 100]
),您仍然会得到范围 [0, 100]
.
显然现代版本的 Django 需要将字段命名为 :
from django.db.models.functions import Upper, Lower
MyModel.objects.aggregate(
<b>low=</b>Min(Lower('price_range')),
<b>high=</b>Max(Upper('price_range'))
)
是否可以对 Django
的 RangeField
执行聚合函数?
假设我们有 3 个对象 BigIntegerField
price_range
.
第一个对象:price_range = [10,5000]
第二个对象:price_range = [1,5000]
第三个对象:price_range = [100,9000]
Max
和Min
这三个对象的聚合结果为:
min = 1
和 max = 9000
我正在尝试以这种方式汇总 Max
和 Min
:
MyModel.objects.aggregate(Min('price_range'),Max('price_range'),)
引发错误:
ProgrammingError: function min(int8range) does not exist LINE 1: SELECT MIN("app_mymodel"."price_range") AS "price_range__min" FROM "app...
您可以使用 Upper(..)
和 Lower(..)
获得范围边界,因此:
from django.db.models.functions import <b>Upper, Lower</b>
MyModel.objects.aggregate(Min(<b>Lower(</b>'price_range'<b>)</b>), Max(<b>Upper(</b>'price_range'<b>)</b>))
但请注意,如果范围不重叠(例如 [0, 20]
和 [50, 100]
),您仍然会得到范围 [0, 100]
.
显然现代版本的 Django 需要将字段命名为
from django.db.models.functions import Upper, Lower
MyModel.objects.aggregate(
<b>low=</b>Min(Lower('price_range')),
<b>high=</b>Max(Upper('price_range'))
)