如何对过滤的查询集执行聚合并仅返回一次值?
我的现有代码如下。当然,在序列化器中,PZ.objects.all()使其聚合所有项。我不知道如何从序列化器级别获得查询集。要使总价值显示一次,最好在视图中添加一个字段。但是,重写def list():会使过滤停止工作。
我需要这个,因为我正在处理一个显示具有过滤功能的文档的表。此外,还会有分页。例如,在选择了创建日期范围之后,必须对文档的值求和。
视图:
class PZListAPIView(ListAPIView):
queryset = PZ.objects.all()
serializer_class = PZModelSerializer
filterset_fields = {
'id': ['exact', 'in', 'contains', 'range']
}
序列化器:
class PZModelSerializer(serializers.ModelSerializer):
net_value_sum = serializers.SerializerMethodField('get_net_value_sum')
class Meta:
model = PZ
fields = '__all__'
def get_net_value_sum(self, obj):
return PZ.objects.aggregate(Sum('net_value'))['net_value__sum']
反应:
[
{
"id": 41,
"net_value_sum": 28.0,
"status": "C",
"net_value": "6.00"
},
{
"id": 42,
"net_value_sum": 28.0,
"status": "S",
"net_value": "10.00"
}
]
所期望的回应:
[
"net_value_sum": 16.0,
{
"id": 41,
"status": "C",
"net_value": "6.00"
},
{
"id": 42,
"status": "S",
"net_value": "10.00"
}
]
我自己设法找到了解决这个问题的方法。您需要在返回过滤后的查询集时重写'def list():'方法。然后在视图中的这个查询集上返回聚合值。代码看起来像这样:
class PZListAPIView(ListAPIView):
queryset = PZ.objects.all()
serializer_class = PZModelSerializer
filterset_fields = {
'id': ['exact', 'in', 'contains', 'range']
}
def get_queryset(self):
return PZ.objects.all()
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
net_value = queryset.aggregate(Sum('net_value'))['net_value__sum']
return Response([{'net_value': net_value},serializer.data])