Python 序列化程序Django中的求和数据
我想从嵌套对象求和数据 我的模型:Python 序列化程序Django中的求和数据,python,django,Python,Django,我想从嵌套对象求和数据 我的模型: 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 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(自身、obj)
但我不知道如何从to_表示的序列化对象中获取数据
答复示例:
[
{
"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到_表示(自身、实例):
结果=超级(DietSerializer,self).to_表示(实例)
结果['feeds']=MealSerializer(instance.feeds,many=True)。数据
#您可以使用下面的列表理解:
结果[“kal_sum”]=总和([膳食[“kcal”]表示结果中的膳食[“膳食])
返回结果
类元:
模型=模型饮食
fields='\uuuuu all\uuuuu'
谢谢你,Arakkal Abu,但我找到了另外的方法来做这件事;)
我在我的模型中添加了:
@property
def total_kcal(self):
qs = self.meals.through.objects.all().aggregate(total_kcal=models.Sum('meal__kcal'))
return qs['total_kcal']
并将DietSerializer中的字段更改为:
fields=['day'、'type'、'fends'、'user'、'total\u kcal']
谢谢:)我写了额外的方法:)
@property
def total_kcal(self):
qs = self.meals.through.objects.all().aggregate(total_kcal=models.Sum('meal__kcal'))
return qs['total_kcal']