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]
这三个对象的结果Max和Min聚合将是:
min = 1 和 max = 9000
我试图聚集Max和Min这种方式:
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...
您可以获取与域范围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)