我想在模型中的列上使用聚合函数。
以下是我的模特: -
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
答案 0 :(得分:2)
我知道权重是一个char字段,我正在添加一个char字段,我认为这是不允许在postgres中,但是如何改变我的查询以使其有效?
或者:
为weight
使用合适的数据类型 - 可能是float4
或float8
(double precision
),但如果需要,可以numeric
;或
在汇总前投放到数字类型,因此您运行SUM( CAST("data_shipmentweightmapping"."weight" AS float4))
此外,为什么它在MySql中工作而不在postgres中
MySQL允许你做各种PostgreSQL没有的疯狂事情。就像在一起添加一堆文本字段并隐式将它们转换为数字一样。插入零作为日期。比较空值是否相等。
如果你在STRICT ANSI模式下运行MySQL(你应该总是这样做),那么它可以让你做的奇怪事情更加明智 - 或者没有。