繁体   English   中英

序列化器 Django 中的数据总和

[英]Sum data in serializer Django

我想从嵌套的 object 中求和数据。

我的 model:

class Diet(models.Model):
    day = models.IntegerField()

    meals = models.ManyToManyField(Meal)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.day} - {self.user}'

我的观点:

class DietViewSet(viewsets.ModelViewSet):
    queryset = Diet.objects.all()
    serializer_class = DietSerializer
    pagination_class = None

    def get_queryset(self):
        if self.action == 'list':
            self.queryset = Diet.objects.filter(user=self.request.user).order_by('day')
        else:
            self.queryset = Diet.objects.all().order_by('day')
        return super(DietViewSet, self).get_queryset()

    def get_permissions(self):
        if self.action in ['list', 'retrieve']:
            self.permission_classes = [permissions.AllowAny]
        else:
            self.permission_classes = [IsDietician]
        return super(DietViewSet, self).get_permissions()

我的序列化器:

class MealSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Meal
        fields = '__all__'


class DietSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        result = super(DietSerializer, self).to_representation(instance)
        result['meals'] = MealSerializer(instance.meals, many=True).data

        return result

    class Meta:
        model = models.Diet
        fields = '__all__'

现在我想添加将根据膳食数据计算的total_kcal 我试过 kcal = serializers.MethodSerializerField()

def get_kcal(self, obj)

但我不知道如何从 to_representation 中的序列化对象中获取数据。

示例响应:

[
   {
      "id":1,
      "day":1,
      "user":1,
      "meals":[
         {
            "id":4,
            "name":"Rise",
            "description":"",
            "kcal":150.0,
            "protein":3.0,
            "fat":0.0,
            "carbs":28.0
         },
         {
            "id":5,
            "name":"Chocoloate",
            "description":"",
            "kcal":200.0,
            "protein":0.0,
            "fat":0.0,
            "carbs":100.0
         }
      ]
   }
]

您可以在此处使用 Python 的列表推导

class DietSerializer(serializers.ModelSerializer):
    def to_representation(self, instance):
        result = super(DietSerializer, self).to_representation(instance)
        result['meals'] = MealSerializer(instance.meals, many=True).data

        # You can use the list comprehension here as result["kal_sum"] = sum([meal["kcal"] for meal in result['meals']])

        return result

    class Meta:
        model = models.Diet
        fields = '__all__'

谢谢Arakkal Abu,但我找到了其他方法;)

我添加到我的 model 中:

@property
def total_kcal(self):
    qs = self.meals.through.objects.all().aggregate(total_kcal=models.Sum('meal__kcal'))
    return qs['total_kcal']

并将 DietSerializr 中的字段更改为:

fields = ['day', 'type', 'meals', 'user', 'total_kcal']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM