Django/Postgres:在 RangeField 上聚合

Mil*_*ano 4 sql django postgresql aggregate-functions django-orm

是否可以对Django's执行聚合函数RangeField

假设我们有 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'),)
Run Code Online (Sandbox Code Playgroud)

这引发了错误:

ProgrammingError: function min(int8range) 不存在 LINE 1: SELECT MIN("app_mymodel"."price_range") AS "price_range__min" FROM "app...

Wil*_*sem 5

您可以获取与域范围Upper(..)Lower(..)这样:

from django.db.models.functions import Upper, Lower

MyModel.objects.aggregate(Min(Lower('price_range')), Max(Upper('price_range')))
Run Code Online (Sandbox Code Playgroud)

但请注意,如果范围不重叠(例如[0, 20][50, 100]),您仍然会得到一个 range [0, 100]

显然现代版本的 Django 需要像@EricTheise 所说的那样命名字段:

from django.db.models.functions import Upper, Lower

MyModel.objects.aggregate(
    low=Min(Lower('price_range')),
    high=Max(Upper('price_range'))
)
Run Code Online (Sandbox Code Playgroud)

  • 几年后,很高兴遇到这个答案,Django(3.0.6)给了我一个“类型错误:复杂表达式需要别名”。在[这个答案](/sf/answers/2268544421/)的指导下,我需要做相当于`MyModel.objects.aggregate(lower=Min(Lower('price_range')), upper=Max (上('价格范围')))` (2认同)