首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django Rest Framework ModelViewSets中添加聚合值

如何在Django Rest Framework ModelViewSets中添加聚合值
EN

Stack Overflow用户
提问于 2021-10-20 06:42:13
回答 1查看 122关注 0票数 0

在我的DRF应用程序中,我有以下模型、序列化程序和视图。

models.py

代码语言:javascript
复制
class Log(models.Model):
    plant = models.ForeignKey(Plant, on_delete=models.CASCADE)
    date_time = models.DateTimeField()
    water_consumption = models.PositiveSmallIntegerField()
    elec_consumption = models.PositiveSmallIntegerField()

serializers.py

代码语言:javascript
复制
class ConsumptionSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Log
        fields = ("water_consumption", "elec_consumption")

views.py

代码语言:javascript
复制
class ConsumptionViewSet(viewsets.ModelViewSet):
    
    permission_classes = [permissions.IsAuthenticated, ]
    serializer_class = ConsumptionSerializer

    def get_queryset(self):
        # Get params from url
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')
        # Make sure params are not null
        if start_date is not None and end_date is not None:
            queryset = queryset.filter(date_time__range=[start_date, end_date])
            return queryset
        else:
            raise ValidationError({"ERROR": ["No params found in url"]})

这是可行的,它在JSON中输出如下所示:

代码语言:javascript
复制
[
    {
        "water_consumption": 1,
        "electrical_consumption": 1
    },
    {
        "water_consumption": 1,
        "electrical_consumption": 1
    },
    {
        "water_consumption": 1,
        "electrical_consumption": 1
    },
]

我想要实现的是除了这些数据之外还接收一些聚合数据,如下所示:

代码语言:javascript
复制
{
    "total_water_consumption": 3,
    "total_elec_consumption": 3,
    "detailed_logs": [{
        "water_consumption": 1,
        "electrical_consumption": 1
    },
    {
        "water_consumption": 1,
        "electrical_consumption": 1
    },
    {
        "water_consumption": 1,
        "electrical_consumption": 1
    }]
}

我应该如何定制查询集以添加总值?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 07:01:17

您可以在序列化程序文件中使用SerializerMethodField完成此操作

文档来源:https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

并且您可以在序列化程序中以context的形式访问request

代码语言:javascript
复制
from django.db.models import Sum


class ConsumptionSerializer(serializers.ModelSerializer):
    total_water_consumption = serializers.SerializerMethodField()
    total_elec_consumption = serializers.SerializerMethodField()
    
    class Meta:
        model = Log
        fields = ("water_consumption", "elec_consumption")

    def get_total_water_consumption(self, obj):
        request = self.context['request']
        query_params = request.query_params.get(...)
        return Log.objects.filter(...).aggregate(Sum('water_consumption')).get('water_consumption__sum')

    def get_total_elec_consumption(self, obj):
        request = self.context['request']
        query_params = request.query_params.get(...)
        return Log.objects.filter(...).aggregate(Sum('elec_consumption')).get('elec_consumption__sum')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69641392

复制
相关文章

相似问题

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