Django/Postgres:在 RangeField 上聚合

Django/Postgres: Aggregate on RangeField

是否可以对 DjangoRangeField 执行聚合函数?

假设我们有 3 个对象 BigIntegerField price_range.

第一个对象:price_range = [10,5000]

第二个对象:price_range = [1,5000]

第三个对象:price_range = [100,9000]

MaxMin这三个对象的聚合结果为:

min = 1max = 9000

我正在尝试以这种方式汇总 MaxMin

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'))
)