You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:20:29