如何从嵌套JSON的logs中统计work_hours总和?Django序列化相关
解决方法
方法一:数据库层面聚合推荐
直接在查询用户数据时,通过annotate指定要聚合的字段为logs__work_hours(而非默认关联的主键),这种方法效率更高,适合数据量较大的场景。
步骤1:修改视图查询集
在获取User数据的视图中,添加聚合逻辑:
from django.db.models import Sum from rest_framework import viewsets from .models import User from .serializers import UserSerializer class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.annotate(total_work_hours=Sum('logs__work_hours')).all() serializer_class = UserSerializer
步骤2:更新序列化器
在UserSerializer中新增字段用于返回聚合结果:
class UserSerializer(serializers.ModelSerializer): logs = UserLogsSerializer(read_only=True, many=True) total_work_hours = serializers.IntegerField(read_only=True) # 新增总工时字段 class Meta: model = User fields = '__all__'
完成后返回的JSON会包含total_work_hours字段,值即为对应logs中work_hours的总和。
方法二:序列化器层面计算
如果不想修改查询集,可以通过SerializerMethodField在序列化阶段计算总和,适合数据量较小的场景:
修改UserSerializer
class UserSerializer(serializers.ModelSerializer): logs = UserLogsSerializer(read_only=True, many=True) total_work_hours = serializers.SerializerMethodField() def get_total_work_hours(self, obj): # 遍历当前用户的所有日志,累加工时 return sum(log.work_hours for log in obj.logs.all()) class Meta: model = User fields = '__all__'
内容的提问来源于stack exchange,提问作者Marjoe Manicad
相关产品推荐
相关产品推荐

