首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-rest-framework聚合和字段

django-rest-framework聚合和字段
EN

Stack Overflow用户
提问于 2020-07-18 13:17:33
回答 1查看 446关注 0票数 0

serializers.py

代码语言:javascript
复制
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__"

models.py

代码语言:javascript
复制
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)

view.py

代码语言:javascript
复制
class BuildPlanNewView(viewsets.ModelViewSet):
    queryset =  BuildPlanNew.objects.all()
    serializer_class = BuildPlanNewSerializer


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

我得到的结果是:

代码语言:javascript
复制
   [{
        "StatusName": "1234",
        "total_build_plan_list": 0
    }]

我所期待的结果:

代码语言:javascript
复制
   [{
        "StatusName": "1234",
        "total_build_plan_list": 0,
        "QtyPreset_count":20,
        "Objective_count":30
    }]

这里我想从外键表中获取合计和平均值。

需要QtyPreset_count sum as QtyPreset_count需要Objective_count sum as as Objective_count

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

请看一看

EN

回答 1

Stack Overflow用户

发布于 2020-07-18 13:42:10

只需向序列化程序中添加字段,就像到目前为止所做的那样

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62964936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档