Django Postgres聚合函数

时间:2014-07-08 04:15:22

标签: mysql django postgresql aggregate-functions

我想在模型中的列上使用聚合函数。

以下是我的模特: -

class ShipmentWeightMapping(models.Model):
    weight = models.CharField(max_length = 255)
    status = models.CharField(max_length = 255)
    time = models.DateTimeField( auto_now_add = True)
    shipment_id = models.ForeignKey('Shipment', related_name = 'weights')

这是我的聚合查询: -

shipment_weight_obj = ShipmentWeightMapping.objects.filter(shipment_id__in = shipment_id_list).aggregate(Avg('weight'),Max('weight'),Min('weight'),Sum('weight'))
total_weight = shipment_weight_obj['weight__sum']
max_weight = shipment_weight_obj['weight__max']
min_weight = shipment_weight_obj['weight__min']
avg_weight = shipment_weight_obj['weight__avg']

以上代码以MySQL作为DB运行,但在与postgres一起使用时返回错误,它返回错误: -

LINE 1: SELECT SUM("data_shipmentweightmapping"."weight") AS "weight...
[Tue Jul 08 04:05:38 2014] [error]                ^
[Tue Jul 08 04:05:38 2014] [error] HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

这是怎么回事?我知道权重是一个char字段,我正在添加一个char字段,我认为在postgres中不允许这样做,但是如何改变我的查询以使其有效?另外,为什么它在MySql中工作而不在postgres

1 个答案:

答案 0 :(得分:2)

  

我知道权重是一个char字段,我正在添加一个char字段,我认为这是不允许在postgres中,但是如何改变我的查询以使其有效?

或者:

  • weight使用合适的数据类型 - 可能是float4float8double precision),但如果需要,可以numeric;或

  • 在汇总前投放到数字类型,因此您运行SUM( CAST("data_shipmentweightmapping"."weight" AS float4))

  

此外,为什么它在MySql中工作而不在postgres中

MySQL允许你做各种PostgreSQL没有的疯狂事情。就像在一起添加一堆文本字段并隐式将它们转换为数字一样。插入零作为日期。比较空值是否相等。

如果你在STRICT ANSI模式下运行MySQL(你应该总是这样做),那么它可以让你做的奇怪事情更加明智 - 或者没有。