首页 > 解决方案 > django-rest-framework 聚合总和字段

问题描述

序列化程序.py

class BuildPlanNewSerializer(serializers.ModelSerializer):
    StatusName = serializers.CharField(source='BuildPlanStatusID.StatusName', read_only=True)
    # build_plan_list_new = serializers.StringRelatedField(many=True, read_only=True)

    total_build_plan_list = serializers.SerializerMethodField()

    def get_total_build_plan_list(self, language):
        return language.build_plan_list_new.count()

    class Meta:
        model = BuildPlanNew
        fields = ('StatusName', 'total_build_plan_list')


class BuildPlanListNewSerializer(serializers.ModelSerializer):
    sku = serializers.CharField(source='ProductID.sku', read_only=True)
    class Meta:
        model = BuildPlanListNew
        fields = "__all__"

模型.py

class BuildPlanNew(models.Model):
    emp_id = models.ForeignKey(Employee, on_delete=models.CASCADE, null=True, blank=True)
    StartDate = models.DateTimeField()
    EndDate = models.DateTimeField()
    BuildPlanStatusID = models.ForeignKey(GlobalStatus, on_delete=models.CASCADE)

class BuildPlanListNew(models.Model):
    BuildPlanID = models.ForeignKey(BuildPlanNew, on_delete=models.CASCADE, null=True, blank=True, related_name="build_plan_list_new")
    ProductID = models.ForeignKey(Product, on_delete=models.CASCADE)
    TotalPlanQty = models.IntegerField()
    TotalBuiltQty = models.IntegerField())
    QtyPreset   = models.IntegerField(default=None, max_length=256)
    Objective   = models.IntegerField(default=None, max_length=256)
    QtyAssigned = models.IntegerField(default=None, max_length=256)

视图.py

class BuildPlanNewView(viewsets.ModelViewSet):
    queryset =  BuildPlanNew.objects.all()
    serializer_class = BuildPlanNewSerializer


class BuildPlanListNewView(viewsets.ModelViewSet):
    queryset =  BuildPlanListNew.objects.all()
    serializer_class = BuildPlanListNewSerializer

结果我得到:

   [{
        "StatusName": "1234",
        "total_build_plan_list": 0
    }]

我期待的结果:

   [{
        "StatusName": "1234",
        "total_build_plan_list": 0,
        "QtyPreset_count":20,
        "Objective_count":30
    }]

在这里,我想从外键表中获取汇总的总和和平均值。

需要 QtyPreset_count sum asQtyPreset_count 需要 Objective_count sum asObjective_count

我已经分享了我的模型视图和序列化程序

请看一看

标签: djangodjango-rest-framework

解决方案


只需像您到目前为止所做的那样将字段添加到您的序列化程序

from django.db.models import Sum, Avg

class BuildPlanNewSerializer(serializers.ModelSerializer):
    StatusName = serializers.CharField(source='BuildPlanStatusID.StatusName', read_only=True)
    # build_plan_list_new = serializers.StringRelatedField(many=True, read_only=True)

    total_build_plan_list = serializers.SerializerMethodField()
    QtyPreset_count = serializers.SerializerMethodField()
    Objective_count = serializers.SerializerMethodField()

    def get_total_build_plan_list(self, language):
        return language.build_plan_list_new.count()

    def get_QtyPreset_count(self, language):
        return language.build_plan_list_new.aggregate(Sum('QtyPreset'))
        # return language.build_plan_list_new.aggregate(Avg('QtyPreset')) if you need it's average

    def get_Objective_count(self, language):
        return language.build_plan_list_new.aggregate(Sum('Objective'))

    class Meta:
        model = BuildPlanNew
        fields = ('StatusName', 'total_build_plan_list')

推荐阅读