Django / Postgres:在RangeField上聚合 [英] Django/Postgres: Aggregate on RangeField

查看:61
本文介绍了Django / Postgres:在RangeField上聚合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以在 Django RangeField 上执行聚合功能?



比方说,我们有3个对象,它们的 BigIntegerField price_range



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



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



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



Max Min 这三个对象的聚合将是:



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导入

 上,下

MyModel.objects.aggregate(
low = Min(Lower('price_range')),
high = Max(Upper('price_range'))

Is it possible to perform aggregation functions on Django's RangeField?

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 and Min aggregation of these three objects would be:

min = 1 and max = 9000

I'm trying to aggregate Max and Min 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(..) and Lower(..) 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆