Django聚合操作中强制Avg函数返回整数而非Decimal类型的方案咨询
解决方案
你可以直接在ORM聚合查询阶段完成取整+类型转换操作,无需后续单独修改字典值,步骤如下:
1. 导入所需ORM函数
from django.db.models import Count, Min, Max, Avg, Coalesce, Round, IntegerField
2. 修改聚合查询逻辑
在price_avg的计算逻辑中嵌套Round+Cast操作,直接在数据库层面完成取整和整数类型转换:
stats = Ad.objects.aggregate( ads_total=Count('pk'), price_min=Coalesce(Min('price'), Val(0)), price_avg=Coalesce(Cast(Round(Avg('price')), output_field=IntegerField()), Val(0)), price_max=Coalesce(Max('price'), Val(0)), )
原理说明
你之前单独用Round()返回X.0格式的原因是Round默认返回浮点/Decimal类型,外层套一层Cast指定输出为整数字段后,数据库查询结果会直接返回纯整数,不需要再用Python代码单独处理stats字典。
备选方案(DRF场景)
如果你是通过Django REST Framework返回接口数据,也可以直接在对应序列化器中将price_avg字段声明为IntegerField,序列化阶段会自动完成取整+类型转换,不需要修改查询逻辑。
内容的提问来源于stack exchange,提问作者user9745220
相关产品推荐
相关产品推荐

