Django使用aggregate(Sum)聚合时抛出int()参数不能为dict错误求助
问题原因
Django ORM的aggregate()方法返回值为字典类型,格式为{聚合别名__聚合函数: 结果值},你直接将完整字典传给了序列化器声明为IntegerField的total_Standard、total_Foil字段,序列化器尝试将字典转换为整数时触发类型错误。
同时你当前的写法会对数据库发起3次查询,存在性能冗余,可合并为一次查询获取所有聚合结果。
修复代码
修改views.py中的逻辑如下:
from django.db.models import Sum, Count # Inventory Data class InventoryData(views.APIView): def get(self, request): # 一次查询拿到所有聚合结果,减少数据库请求次数 aggregate_result = inventory_cards.objects.filter(user_id=request.user.id).aggregate( total_unique=Count('id', distinct=True), total_standard=Sum('standard'), total_foil=Sum('foil') ) data = [{ "total_Cards_Unique": aggregate_result['total_unique'] or 0, "total_Cards": 0, # 从聚合返回的字典中取出数值,空结果默认返回0避免None报错 "total_Standard": aggregate_result['total_standard'] or 0, 'total_Foil': aggregate_result['total_foil'] or 0, }] results = InventorySerializers(data, many=True).data return Response(results)
补充说明
代码中添加or 0是为了处理用户无任何库存记录时,Sum、Count返回None的情况,避免空值传入整型字段触发额外报错。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

